PolyBase でのプッシュダウン計算

適用対象: はいSQL Server 2016 (13.x) 以降

プッシュダウン計算を使用すると、外部データ ソースに対するクエリのパフォーマンスが向上します。 SQL Server 2016 (13.x) 以降では、プッシュダウン計算は Hadoop の外部データ ソースで使用できました。 SQL Server 2019 (15.x) には、他の種類の外部データ ソースのプッシュダウン計算が導入されています。

注意

PolyBase プッシュダウン計算によりクエリに対するベネフィットがあるかどうかを判断するには、「外部プッシュダウンが発生した場合の確認方法」を参照してください。

プッシュダウン計算を有効にする

次の記事には、特定の種類の外部データ ソース用のプッシュダウン計算の構成に関する情報が含まれています。

この表には、さまざまな外部データ ソースに対するプッシュダウン計算のサポートがまとめてあります。

Data Source 結合 プロジェクション 集計 フィルタ 統計
汎用 ODBC Yes はい はい はい Yes
Oracle Yes はい はい はい はい
SQL Server はい はい はい はい はい
Teradata はい はい はい はい はい
*MongoDB* _ _ いいえ* はい いいえ いいえ はい
Hadoop いいえ Yes *一部* *一部* はい
Azure Blob Storage いいえ いいえ いいえ いいえ はい

* Azure Cosmos DB プッシュダウン サポートは MongoDB 用 Cosmos DB API 経由で有効にします。

** プッシュダウン計算と Hadoop プロバイダーに関するページを参照してください。

注意

T-SQL 構文によってプッシュダウン計算はブロックできます。 詳細については、「プッシュダウンを防ぐ構文」を参照してください。

プッシュダウン計算と Hadoop プロバイダー

PolyBase では現在、Hortonworks Data Platform (HDP) と Cloudera Distributed Hadoop (CDH) の 2 つの Hadoop プロバイダーがサポートされています。 プッシュダウン計算の観点からは、この 2 つの機能に違いはありません。

Hadoop で計算プッシュダウン機能を使用するには、ターゲットの Hadoop クラスターに、ジョブの履歴サーバーが有効になっている HDFS のコア コンポーネントの YARN と MapReduce がある必要があります。 PolyBase から MapReduce 経由でプッシュダウン クエリを送信し、ジョブの履歴サーバーからステータスをプルします。 いずれかのコンポーネントがない場合、クエリは失敗します。

集計によっては、必ずデータが SQL Server に到達した後に発生します。 ただし、集計の一部は、Hadoop で発生します。 これは、超並列処理システムで一般的な集計の計算方法です。

Hadoop プロバイダーでは、次の集計とフィルターがサポートされます。

集計 フィルター (バイナリの比較)
Count_Big NotEqual
SUM LessThan
平均 LessOrEqual
Max GreaterOrEqual
Min GreaterThan
Approx_Count_Distinct Is
IsNot

プッシュダウン計算の主な有益シナリオ

PolyBase プッシュダウン計算を使用すれば、計算タスクを外部データ ソースに委任できます。 これにより、SQL Server インスタンス上のワークロードが軽減されので、パフォーマンスが大幅に向上する可能性があります。

SQL Server では、リモート コンピューティングを利用してネットワーク経由で送信されるデータを制限するために、結合、プロジェクション、集計、およびフィルターを外部データ ソースにプッシュすることができます。

結合のプッシュダウン

多くの場合、PolyBase を使用すると結合演算子のプッシュダウンが容易になり、パフォーマンスが大幅に向上します。

外部データ ソースで結合を行うことができる場合、これによりデータ移動の量が減少し、クエリのパフォーマンスが向上します。 結合プッシュダウンを使用しない場合は、結合対象のテーブルからのデータを tempdb にローカルに配置してから、結合を行う必要があります。

行のサブセットを選択する

外部テーブルから行のサブセットを選択するクエリのパフォーマンスを改善するには、述語のプッシュダウンを使用します。

この例では、SQL Server によって map-reduce ジョブを開始し、Hadoop で述語 customer.account_balance < 200000 である行を取得します。 このクエリは、テーブルのすべての行をスキャンせずに完了できるため、述語の条件に合う行のみが SQL Server にコピーされます。 この方法で時間が大幅に短縮され、残高が 200000 未満の顧客数が、口座残高が 200000 以上の顧客数と比較して少ない場合に、一時的な記憶域が少なくなります。

SELECT * FROM customer WHERE customer.account_balance < 200000;
SELECT * FROM SensorData WHERE Speed > 65;  

列のサブセットを選択する

外部テーブルから列のサブセットを選択するクエリのパフォーマンスを改善するには、述語のプッシュダウンを使用します。

このクエリでは、SQL Server で map-reduce ジョブを開始し、Hadoop の区切られたテキスト ファイルを前処理して、customer.name および customer.zip_code という 2 列のデータのみが SQL Server にコピーされるようにします。

SELECT customer.name, customer.zip_code
FROM customer
WHERE customer.account_balance < 200000;

基本的な式と演算子のプッシュダウン

SQL Server では、述語のプッシュダウンに次の基本的な式と演算子を使用できます。

  • 数値、日付値、時間値の 2 項比較演算子 (<>=!=<>>=<=)。
  • 算術演算子 (+-*/%)。
  • 論理演算子 (ANDOR)。
  • 単項演算子 (NOTIS NULLIS NOT NULL)。

BETWEENNOTIN、および LIKE の演算子がプッシュダウンされる場合があります。 実際の動作は、クエリ オプティマイザーが演算子式をどのように基本的な関係演算子を使用する一連のステートメントとして書き換えるかに依存します。

この例のクエリには、Hadoop にプッシュダウンできる述語が複数あります。 SQL Server を使用すると、map-reduce ジョブを Hadoop にプッシュして、述語 customer.account_balance <= 200000 を実行できます。 BETWEEN 92656 AND 92677 の式もまた、Hadoop にプッシュできる 2 項演算子と論理演算子とで構成されます。 customer.account_balance AND customer.zipcode 内の論理 が最後の式です。

この述語の組み合わせで、map-reduce ジョブですべての WHERE 句を実行できます。 SELECT 条件を満たすデータのみが SQL Server にコピーされて戻されます。

SELECT * FROM customer 
WHERE customer.account_balance <= 200000 
AND customer.zipcode BETWEEN 92656 AND 92677;

プッシュダウンでサポートされている関数

SQL Server では述語のプッシュダウンに次の関数を使用することができます。

文字列関数

  • CONCAT
  • DATALENGTH
  • LEN
  • LIKE
  • LOWER
  • LTRIM
  • RTRIM
  • SUBSTRING
  • UPPER

数学関数

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • CEILING
  • COS
  • EXP
  • FLOOR
  • POWER
  • SIGN
  • SIN
  • SQRT
  • TAN

一般関数

  • COALESCE
  • NULLIF

日付と時刻の関数

  • DATEADD
  • DATEDIFF
  • DATEPART

プッシュダウンを防止する構文

次の T-SQL 関数または構文を実行すると、プッシュダウン計算ができなくなります。

  • AT TIME ZONE
  • CONCAT_WS
  • TRANSLATE
  • RAND
  • CHECKSUM
  • BINARY_CHECKSUM
  • ISJSON
  • JSON_VALUE
  • JSON_QUERY
  • JSON_MODIFY
  • NEWID
  • STRING_ESCAPE
  • COMPRESS
  • DECOMPRESS
  • GREATEST
  • LEAST
  • PARSE

FORMAT および TRIM 構文のプッシュダウン サポートは、SQL Server 2019 (15.x) CU10 で導入されました。

変数を含むフィルター句

フィルター句で変数を指定する場合、既定では、フィルター句のプッシュダウンが防止されます。 たとえば、次のクエリを実行した場合、フィルター句はプッシュダウンされません。

DECLARE @BusinessEntityID INT

SELECT * FROM [Person].[BusinessEntity]  
WHERE BusinessEntityID = @BusinessEntityID;

変数のプッシュダウンを実現するには、クエリ オプティマイザーの修正プログラム機能を有効にする必要があります。 これは、次のいずれかの方法で実行できます。

  • インスタンス レベル: インスタンスの起動時のパラメーターとしてトレース フラグ 4199 を有効にします
  • データベース レベル: PolyBase 外部オブジェクトを持つデータベースのコンテキストで、ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON を実行します
  • クエリ レベル: クエリ ヒント OPTION (QUERYTRACEON 4199) または OPTION (USE HINT ('ENABLE_QUERY_OPTIMIZER_HOTFIXES')) を使用します

これは、sp_executesql の実行に適用されます。

プッシュダウンを強制する

SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (FORCE EXTERNALPUSHDOWN);

プッシュダウンを無効にする

SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (DISABLE EXTERNALPUSHDOWN);

次のステップ

関連項目