SELECT productkey, SUM(TotalProductCost)
FROM FactResellerSalesXL_CCI
GROUP BY productkey;
SELECT SUM(TotalProductCost)
FROM FactResellerSalesXL_CCI;
字符串谓词下推
在设计数据仓库架构时,建议的架构建模是使用星型架构或雪花型架构,其中包括一个或多个事实数据表和多个维度表。 事实数据表 存储业务度量值或事务,而 维度表 存储分析事实数据需要跨越的维度。
例如,事实可以是一条表示某一特定区域中某一特定产品的销售额的记录,而维度则表示一组区域、产品等。 事实数据表和维度表通过主键/外键关系进行连接。 最常用的分析查询将一个或多个维度表与事实数据表进行联接。
让我们设想一个维度表 Products
。 典型的主键是通常用字符串数据类型表示的 ProductCode
。 为提高查询性能,最佳做法是创建代理键(通常为整数列),从事实数据表引用维度表中的行。
列存储索引非常高效地运行具有联接/涉及数值的谓词或基于整数的键的分析查询。 但是,在很多客户工作负荷中,我们发现使用基于字符串的列链接事实/维度表,结果是使用列存储索引的查询性能并不如预期。 SQL Server 2016 (13.x) 通过将包含字符串列的谓词下推到 SCAN 节点,使用基于字符串的列显著提高了分析的性能。
字符串谓词下推利用为列创建的主/辅助字典来提高查询性能。 例如,让我们考虑在行组中创建一个包含 100 个不同字符串值的字符串列段。 假定有 100 万行,这意味着平均每个不同的字符串值被引用了 10,000 次。
使用字符串谓词下推,执行查询时针对字典中的值计算谓词,如果它符合条件,引用字典值的所有行都将自动符合条件。 这在两个方面提高了性能:
仅返回符合条件的行,从而减少了需要传递出 SCAN 节点的行数。
显著减少了字符串比较次数。 在此示例中,只需要 100 次字符串比较,而不用比较 100 万次。 如下所述,有一些限制:
不能对增量行组执行字符串谓词下推。 增量行组中的列没有字典。
如果字典大小超过 64 KB,则不能执行字符串谓词下推。
不支持计算结果为 NULL 的表达式。
数据类型选择可能会对列存储索引上查询的基于通用筛选谓词的查询性能产生重大影响。
在列存储数据中,行组由列段组成。 每个段都有元数据可用于快速消除段,无需读取它们。 此段消除适用于数值、日期和时间数据类型,以及小数位数小于或等于 2 的 datetimeoffset 数据类型。 从 SQL Server 2022 (16.x) 开始,段消除功能扩展到字符串、二进制文件、guid 数据类型以及用于小数位数大于 2 的 datetimeoffset 数据类型。
升级到支持字符串 min/max 段消除的 SQL Server 版本(SQL Server 2022 (16.x) 及更高版本)之后,列存储索引在使用 REBUILD 或 DROP/CREATE 重新生成之前不会受益于此功能。
段消除不适用于 LOB 数据类型,例如 (max) 数据类型长度。
目前,只有 SQL Server 2022 (16.x) 和更高版本支持对 LIKE
谓词的前缀(例如 column LIKE 'string%'
)使用聚集列存储行组消除。 对于 LIKE
的非前缀用法(例如 column LIKE '%string'
),不支持段消除。
在 Azure Synapse Analytics 中,从 SQL Server 2022 (16.x) 开始,可以创建有序聚集列存储索引,以便按列进行排序以帮助消除段,尤其是字符串列。 在有序聚集列存储索引中,索引键中第一列的段消除最为有效,因为它已排序。 由于表中其他列的段消除导致性能提升将不太可预测。 有关有序聚集列存储索引的详细信息,请参阅对大型数据仓库表使用有序聚集列存储索引。
使用查询连接选项 SET STATISTICS IO,可以查看操作中的段消除。 查找如下所示的输出,以指示已发生段消除。 行组由列段组成,因此这可能表示段消除。 以下 SET STATISTICS IO 输出查询示例,查询跳过了大约 83% 的数据:
Table 'FactResellerSalesPartCategoryFull'. Segment reads 16, segment skipped 83.
列存储索引设计指南
列存储索引数据加载指南
开始使用列存储进行实时运行分析
针对数据仓库的列存储索引
重新组织和重新生成索引
列存储索引体系结构
CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL)
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback。
提交和查看相关反馈