SQL Server 中的列存储索引是否仅在查询使用聚合函数时有用?
3 回答
当然没有。即使它们被设计为在DWH
环境中使用,它们也可以在OLTP
环境中使用。
即使在 中使用DWH
,聚合也不是必需的。
列存储索引对数据使用不同的存储格式,按列而不是按行存储压缩数据。这种存储格式有利于数据仓库、报告和分析环境中的查询处理,虽然它们通常读取大量行,但查询只使用表中的列的子集。
所以第一个好处是数据压缩。
当您使用 PAGE 数据压缩时,列存储中的压缩是表范围的,非页面范围的(我的意思是应用了字典)。所以压缩比是最好的。与没有列存储但嵌入了页面压缩的同一表相比,定义了聚集列存储索引的表使用的空间更少。
第二个好处是查询什么都不过滤(或几乎什么都不过滤,需要(几乎)所有行)但只需要返回一些列。
当表“按行”存储时,即使您只想要 100 列的 10 列,并且想要所有行,也会读取整个表,因为需要读取整行才能获得请求的 10列出来。当您使用“每列”存储时,只会读取需要的列。
当然,您可以定义一个包含 10 个所需列的索引,但这将占用额外的空间和维护该索引的开销。现在假设您的查询需要这 10 个、其他 10 个和另外 2o 个 100,因此您需要为这些查询创建更多索引。
使用一个列存储索引,您将能够满足所有这些查询
您不能说它们always
对聚合函数很有用,因为它取决于聚合中包含哪些行。如果您对所有行执行聚合 - 它们很有用。如果您因为过滤而只选择少量行,您甚至可以获得比使用传统非聚集索引更差的结果。
正如MSDN中所写,它们可以用于:
- 与传统的面向行的存储相比,在您的数据仓库中实现高达 10 倍的查询性能提升
- 在未压缩的数据大小上获得 10 倍的数据压缩(如果您对压缩感兴趣,请选中该
COLUMNSTORE_ARCHIVE
选项)
此外,根据您的 SQL Server 版本(如果 SQL Server 2017 或更高版本),您可以检查自适应查询处理,因为条件之一是拥有这样的索引:
您应该查看文档并根据您的 SQL Server 版本查看您有哪些选项,并确定该索引将如何影响性能,因为很有可能使事情变得更糟。
很好的是,微软在每篇文章中都提到了列存储索引类型可以永久使用的场景。