假设一个表只包含整数并且具有聚集列存储索引。
CREATE TABLE cci_account
(
AccountKey int NOT NULL,
UnitSold int,
INDEX ColStore CLUSTERED COLUMNSTORE
);
那么看起来,在这样的表中,对一个列按另一个列分组求和总是很快,例如
SELECT
AccountKey,
SUM(UnitSold)
FROM
cci_account
GROUP BY
AccountKey;
为什么这么快?我对列存储架构的理解是,包含的段AccountKey
不知道UnitSold
其行上的值是什么。那么,SQL Server 如何能够如此快速地分组AccountKey
?我无法想象任何算法可以实现这一点。
你的直觉是正确的:这不是一个花哨的算法或任何魔法。只是扫描列存储确实很快。您可以使用有序 CCI 来查看对 AccountKey 值进行排序的影响,这很重要。但在这两种情况下它都很“快”。例如
然后查看时间统计
即:
然后使用 AccountKey 作为 CCI 排序列重新创建它