SQL Server 2014はバッチモードで正確に何を実行できますか?


21

クエリで列ストアインデックスが使用されている場合、SQL Serverはバッチモードを使用できます。ドキュメントは、バッチモードで実行できるものとできないものについては薄い。バッチモード(緑色)で驚くほど多くのことが実行される、次の(動機付けの)クエリプランをご覧ください。

ここに画像の説明を入力してください

(これは推定プランです。実際のプランを使用して、実際の実行モードが実際にバッチであることを確認しました。)

T1のビルド側のみが列ストアインデックスを使用することに注意してください。すべてのプローブ入力(T2およびT3)は行ストアです。彼らのデータはバッチモードに移行しているようです。プローブ側のみで実行されるデータストリームにはバッチモードが使用されていると常に考えていました。

列ストアインデックスに由来しない場合でも、データはバッチモードに移行できるようです。それは疑問を提起します:なぜSQL Serverは行ストアのみのクエリにもバッチモードを使用しないのですか?それらのいくつかのために有益である可能性があります。列ストアインデックスの使用は、SQL Serverでバッチモードを考慮するために必要な正式な要件ですか?列ストアインデックスを持つゼロ行のダミーテーブルを追加して、バッチモードを導入し、パフォーマンスの向上を実現できますか?

SQL Server 2014の時点でバッチモードで正確に実行できるものは何ですか?


5
SQL Serverが行ストアのみのクエリにもバッチモードを使用しないのはなぜですか?CSは現在のところバッチモードのみをサポートしているためです。それらのいくつかのために有益である可能性があります。列ストアインデックスの使用は、SQL Serverでバッチモードを考慮するために必要な正式な要件ですか?はいCSは必須です。Neugebauerによって開かれたRow Storeのバッチモードサポートの実装がまだアクティブな接続項目があります。
キンシャー

2
2016年にバッチモードがBTWと考え得るために新しい可能なトリックがありますsqlmag.com/sql-server/...
マーティン・スミス

回答:


30

SQL Server 2014の時点でバッチモードで正確に実行できるものは何ですか?

SQL Server 2014は、バッチモード演算子の元のリストに次を追加します。

  • ハッシュ外部結合(完全結合を含む)
  • ハッシュ半結合
  • ハッシュアンチセミジョイン
  • Union All(連結のみ)
  • スカラーハッシュ集約(グループ化なし)
  • 削除されたバッチハッシュテーブルビルド

列ストアインデックスに由来しない場合でも、データはバッチモードに移行できるようです。

SQL Server 2012では、バッチ演算子の使用が非常に制限されていました。バッチモードプランの形状は固定されており、ヒューリスティックに依存しており、行モード処理に移行するとバッチモードを再開できませんでした。

SQL Server 2014は、クエリオプティマイザーの一般的なプロパティフレームワークに実行モード(バッチまたは行)を追加します。つまり、計画の任意の時点でバッチモードへの移行とバッチモードからの移行を検討できます。遷移は、プラン内の非表示の実行モードアダプターによって実装されます。これらのアダプターには、最適化中に導入される遷移の数を制限するためのコストが関連付けられています。この新しい柔軟なモデルは、混合モード実行と呼ばれます。

実行モードアダプターは、文書化されていないTF 8607を使用して、オプティマイザーの出力に表示されます(残念ながら、ユーザーに表示される実行プランには表示されません)。

行からバッチから行へのアダプター

列ストアインデックスの使用は、SQL Serverでバッチモードを考慮するために必要な正式な要件ですか?

はい、今日です。この制限の考えられる理由の1つは、バッチモード処理が当然Enterprise Editionに制限されることです。

列ストアインデックスを持つゼロ行のダミーテーブルを追加して、バッチモードを導入することはできますか?

はい、これは動作します。この理由だけで、単一行のクラスター化列ストアインデックスを使用してクロス結合する人々も見ています。falseでダミーの列ストアテーブルに左結合するコメントで行った提案は素晴らしいです。

-- Demo the technique (no performance advantage in this case)
--
-- Row mode everywhere
SELECT COUNT_BIG(*) FROM dbo.FactOnlineSales AS FOS;
GO
-- Dummy columnstore table
CREATE TABLE dbo.Dummy (c1 int NULL);
CREATE CLUSTERED COLUMNSTORE INDEX c ON dbo.Dummy;
GO
-- Batch mode for the partial aggregate
SELECT COUNT_BIG(*) 
FROM dbo.FactOnlineSales AS FOS
LEFT OUTER JOIN dbo.Dummy AS D ON 0 = 1;

ダミーの左外部結合を使用した計画:

ダミーテーブルを使用したバッチモード

ドキュメントは薄い

本当です。

最高の公式情報源は、Columnstore Indexes DescribeSQL Server Columnstore Performance Tuningです。

SQL Server MVP Niko Neugebauerの列ストアに関する一般的な記事はこちらです。

Microsoft Researchの論文「SQL Server Column Storesの機能強化(pdf)」には、2014年の変更に関するいくつかの優れた技術的詳細がありますが、これは公式の製品ドキュメントではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.