多数の巨大なテーブルで構成される Microsoft APS / PDW アプライアンスに取り組んでいます。これらのテーブルのほとんどは、クラスター化された列ストア インデックスを備えています。メンテナンスの理由から、CCI のパーティション内の圧縮された行と圧縮されていない行の数を評価するプロセスを実装しました。圧縮されていない行がある場合のみ、対応するパーティションが再構築されます ( ALTER INDEX... REBUILD PARTITION = ...
)。再構築する必要があるパーティションの評価は、いくつかのテーブルを介して実行されます。そのうちの 1 つは pdw_nodes_column_store_row_groups です。ただし、何らかの理由で、このテーブルのクエリは (その間) 非常に低速です。
SELECT *
FROM sys.pdw_nodes_column_store_row_groups
WHERE object_id = 123456
AND pdw_node_id = 789
AND index_id = 1
さらなる計算は次のようになります (抜粋):
ISNULL(SUM(CASE
WHEN State_description = 'Compressed'
THEN CAST(total_rows AS DECIMAL(12, 2))
END)
, 0) / (SUM(CAST(ISNULL(total_rows, 1) AS DECIMAL(12, 2)))) AS CompRelation
CompRelation < 1 を持つ行のみが「再構築される」と見なされます。
しかし、計算なしのクエリですでにそれだけの時間がかかることを考えると、それが計算自体に関連しているとは思えません。
CCI を使用したパーティション化されていないテーブルの場合、このクエリは 1 つの行を返すのに 4 分かかりました。
どの CCI パーティションを再構築する必要があるかを評価する他の方法はありますか? または、上記のクエリのパフォーマンスを向上させるためにできることはありますか?