web-dev-qa-db-ja.com

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

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

enter image description here

(これは推定計画です。実際の実行モードが本当にバッチであることを確認するために実際の計画を使用しました。)

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

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

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

21
usr

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

SQL Server 2014では、バッチモードオペレーターの元のリストに以下が追加されています。

  • ハッシュ外部結合(完全結合を含む)
  • ハッシュ半結合
  • ハッシュアンチセミ結合
  • すべてユニオン(連結のみ)
  • スカラーハッシュ集計(グループ化なし)
  • バッチハッシュテーブルビルドの削除

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

SQL Server 2012では、バッチオペレーターの使用が非常に制限されていました。バッチモードの計画は固定されており、ヒューリスティックに依存しており、行モード処理への移行が行われると、バッチモードを再開できませんでした。

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

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

Row to Batch to Row adapters

列ストアインデックスの使用は、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;

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

Batch mode with dummy table

ドキュメントが薄い

そうだね。

最高の公式情報源は Columnstore Indexes Descriptiond および SQL Server Columnstore Performance Tuning です。

SQL Server MVPのNiko Neugebauer氏は、列ストア全般についてすばらしいシリーズ here を公開しています。

これは公式の製品ドキュメントではありませんが、Microsoftリサーチペーパー SQL Server列ストアの拡張 (pdf)に2014年の変更点に関する技術的な詳細がいくつかあります。

31
Paul White 9