web-dev-qa-db-ja.com

SQL Server 2016 ColumnStoreクラスタ化インデックス-スキャンを示すクエリプラン、パフォーマンスが良くない

次のようなSQL 2016テーブルがあります。

enter image description here

テーブルに列ストアクラスター化インデックスがあり、他のインデックスはありません。次のクエリを実行しています。

Select *
From dbo.PanelWorkflow
Where ReadTime Between '4/1/2016' And '4/5/2016' And Lineage = 'PBG11A' And ProcessNumber = 5400

クエリプランは次のようになります。

enter image description here

このテーブルには1.1B行があります。クエリプランにはスキャンが表示され、クエリの実行には約1分かかります。 〜21,000行が返されます。これは、列ストアクラスター化インデックスに期待できることですか?スキャンは常に行われますか(テーブルに他のインデックスがない場合)。これは私が期待できる種類のパフォーマンスですか(許容範囲ですが、それほど良くありません)?

統計情報IOをオンに設定し、次の出力を取得しました。

Table 'PanelWorkflow'. Scan count 2, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 9733431, lob physical reads 195, lob read-ahead reads 13045645.
Table 'PanelWorkflow'. Segment reads 955, segment skipped 336.

最後に、上記のクエリは、CSIがどのように実行および動作するかを理解するための厳密なテストクエリです。これは本番レベルのクエリではありません。

2
Randy Minder

テーブルに列ストアクラスター化インデックスがあり、他のインデックスはありません...クエリプランはスキャンを示しています

まあ、それはCCIで利用できる唯一のオプションです。 CCIを使用すると、パフォーマンスの向上は列の削除、圧縮、およびセグメントの削除からもたらされ、すべてがIOの削減に貢献し、スキャンが高速に実行できるようになります。あなたの場合、私は2つのことを見ていきます:

  • セグメントの健全性をチェック: sys.column_store_row_groups 。 1.1Bの行の場合、すべて閉じて圧縮された最大1000個の行グループが必要です。
  • セグメントを削除できる方法でデータをロードしたことを確認してください。 セグメント消去の理解を読む 。日付範囲フィルターを指定すると、クエリはこれらの1000セグメントの1つだけをスキャンし、残りの999をスキップする必要があります。これが発生しない場合は、セグメントが削除されないようにデータをロードしたことを意味します。読み取り Columnstoreインデックス-データ読み込みガイダンス

今、あなたのクエリ:

Select *
From dbo.PanelWorkflow
Where ReadTime Between '4/1/2016' And '4/5/2016' And Lineage = 'PBG11A' And ProcessNumber = 5400

これは、aboutの列ストアと大きなテーブルではありません。日付範囲とその他の基準を満たすすべての列を選択しています。何のためにfor?分析データは、集計の計算とanalysisの作成に関するすべてです。 *。サーバー側で関連分析を計算します。生データのページにページを表示する必要がない方法でアプリを再設計します。

5
Remus Rusanu