SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

カラムストアインデックスの行モードとバッチモードについて

leave a comment

先週、技術ひろば.net 2012年1月 勉強会 に参加させていただいた際に某 SQL Azure な方からカラムストアインデックスのバッチモードについてキラーパスを受けましたので調べてみました。

以下の情報が詳しいのですが、英語がたくさんで理解できていないのでひとまず実機ベースで調べてみました。
カラムストアインデックスの勉強も途中で止まってしまっているので再開しないといけないですね~。

列ストア インデックス
SQL Server Columnstore Index FAQ
SQL Server Columnstore Performance Tuning

■行モードとバッチモード


カラムストアインデックスが使用される場合、実行プランには[Columnstore インデックス スキャン] が使用されます。
# 現状のカラムストアインデックスは Seek のプランはありません。Scan になります。
image

プランをグラフィカルに見ただけでは判断ができないのですが、カラムストアインデックスの実行モードとして行モード (Row Mode) とバッチモード (Batch Mode) の二種類があります。

実行プランにカーソルを当て、詳細を表示するとどちらのモードで実行されているかを確認することができます。
imageimage

左が行モード、右がバッチモードでスキャンされた実行プランになります。
実行モードを確認することで行モード (Row) / バッチモード (Batch) のどちらで実行されたのかを確認できます。

今回は、[SELECT COUNT(*) FROM PersonalInfo] [SELECT COUNT(*) FROM PersonalInfo WHEREN 年齢 > 0] という二種類のクエリで比較をしています。

どちらも全レコード件数を取得しているのには変わりはないのですが、条件の設定有無だけで実行されるモードが変わってきます。

列ストア インデックス に以下のように記載されています。

一部の式の評価が他の式よりも高速化される

列ストア インデックスが使用される場合、一部の一般的な式は、一度に 1 つの行を処理するモードではなくバッチ モードを使用して評価されます。 列ストア インデックスの使用によるクエリの高速化に加え、バッチ モードによってさらに高速化されます。 一部のクエリ実行演算子はバッチ モード処理に対応しません。

バッチに関しては以下のように説明がされています。

高度なクエリ実行テクノロジにより、バッチと呼ばれる列のまとまりが効率的に処理され、CPU 使用率が下がります。

 

先ほどの実行プランを確認すると、[実際のバッチ数] の項目が行モードのときは 0 となっていますが、バッチモードのときは [5651] となっているのが確認できます。
バッチという列のまとまりを使用して処理がされているということがここからも確認することができるようです。

カラムストアインデックスを効果的に利用するための指針として、

クエリ処理: SQL Server では、列ストア インデックスに加えてバッチ処理を導入し、データの列指向を利用しています。 列ストア構造とバッチ処理はどちらもパフォーマンス向上に役立ちますが、どちらか一方のみを利用した場合よりも、パフォーマンスの問題の調査が難しくなる可能性があります。

列ストア インデックスが使用されているかどうかを判断するには、クエリ実行プランを調べます。 次の 3 つの要素が表示されているときに、最大の効果が得られます。

  • クエリ実行プランに列ストア インデックスが表示されている。

  • グラフィカルなクエリ プランで、列ストア インデックスのアイコンにマウス ポインターを合わせると、実際の実行モードが行ではなくバッチであると表示される。
  • グラフィカルな実行プランに Bitmap 物理操作のアイコンが表示される。これは、ビットマップ フィルターによって結合処理の前に行数が削減されていることを示しています。

カラムストアインデックス単体でもパフォーマンス向上の効果が望める可能性がありますが、バッチモードで実行するとさらに効果が望めるようです。

ただし、今回実行したような単純なクエリをバッチモードで処理すると効果が見られないようなので、どちらのモードが適しているかは必ず確認する必要があります。
# 単純なクエリをバッチモードにしたところ、論理読み取り数と CPU 時間が増えていました。

[行モード]

SQL Server の構文解析とコンパイルの時間:
CPU 時間 = 0 ミリ秒、経過時間 = 0 ミリ秒。
テーブル ‘PersonalInfo’。スキャン回数 8、論理読み取り数 48、物理読み取り数 0、先行読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB 先行読み取り数 0。

SQL Server 実行時間:
、CPU 時間 = 530 ミリ秒、経過時間 = 119 ミリ秒。

[バッチモード]

SQL Server の構文解析とコンパイルの時間:
CPU 時間 = 0 ミリ秒、経過時間 = 0 ミリ秒。
テーブル ‘PersonalInfo’。スキャン回数 8、論理読み取り数 806、物理読み取り数 0、先行読み取り数 0、LOB 論理読み取り数 0、LOB 物理読み取り数 0、LOB 先行読み取り数 0。

SQL Server 実行時間:
、CPU 時間 = 1294 ミリ秒、経過時間 = 210 ミリ秒。

SQL Server 2012 の自習書にはカラムストアインデックスを使用する場合に、並列プランにならない場合の処理速度の記載がありましたので、カラムストアインデックスを使用する場合の影響はリアルに近いデータを入れて必ず確認をしておきたいですね。

Written by masayuki.ozawa

1月 25th, 2012 at 7:35 am

Posted in SQL Server

Tagged with ,

Leave a Reply

*