我们正在开发一个 Microsoft APS / PDW 设备,它由许多巨大的表组成。这些表中的大多数都具有聚集列存储索引。出于维护的原因,我们实施了一个流程,该流程评估 CCI 分区中压缩和未压缩的行数。只有当存在未压缩的行时,才会重建相应的分区(ALTER INDEX... REBUILD PARTITION = ...
)。必须重建的分区的评估是通过几个表执行的,其中一个是 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 的未分区表,此查询需要 4 分钟才能返回单行。
是否有任何其他方法来评估需要重建哪些 CCI 分区?或者我们可以做些什么来提高上述查询的性能?