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 DescribeとSQL Server Columnstore Performance Tuningです。
SQL Server MVP Niko Neugebauerの列ストアに関する一般的な記事はこちらです。
Microsoft Researchの論文「SQL Server Column Storesの機能強化(pdf)」には、2014年の変更に関するいくつかの優れた技術的詳細がありますが、これは公式の製品ドキュメントではありません。