-1

SQL Server 中的列存储索引是否仅在查询使用聚合函数时有用?

4

3 回答 3

1

当然没有。即使它们被设计为在DWH环境中使用,它们也可以在OLTP环境中使用。

即使在 中使用DWH,聚合也不是必需的。

列存储索引对数据使用不同的存储格式,按列而不是按行存储压缩数据。这种存储格式有利于数据仓库、报告和分析环境中的查询处理,虽然它们通常读取大量行,但查询只使用表中的列的子集。

所以第一个好处是数据压缩。

当您使用 PAGE 数据压缩时,列存储中的压缩是表范围的,非页面范围的(我的意思是应用了字典)。所以压缩比是最好的。与没有列存储但嵌入了页面压缩的同一表相比,定义了聚集列存储索引的表使用的空间更少。

第二个好处是查询什么都不过滤(或几乎什么都不过滤,需要(几乎)所有行)但只需要返回一些列

当表“按行”存储时,即使您只想要 100 列的 10 列,并且想要所有行,也会读取整个表,因为需要读取整行才能获得请求的 10列出来。当您使用“每列”存储时,只会读取需要的列。

当然,您可以定义一个包含 10 个所需列的索引,但这将占用额外的空间和维护该索引的开销。现在假设您的查询需要这 10 个、其他 10 个和另外 2o 个 100,因此您需要为这些查询创建更多索引。

使用一个列存储索引,您将能够满足所有这些查询

于 2017-11-13T08:04:32.347 回答
0

列存储索引,以列格式存储数据,因此当您使用聚合函数时它们非常有用。原因之一是,当您尝试聚合列时,同构数据压缩要快得多。

但这并不是列存储索引的唯一用途。当您处理数百万行(在多维数据模型中)时,它真的很有帮助。查看官方文档 以及文档以更好地理解。

于 2017-11-13T08:00:13.297 回答
0

您不能说它们always对聚合函数很有用,因为它取决于聚合中包含哪些行。如果您对所有行执行聚合 - 它们很有用。如果您因为过滤而只选择少量行,您甚至可以获得比使用传统非聚集索引更差的结果。

正如MSDN中所写,它们可以用于:

  • 与传统的面向行的存储相比,在您的数据仓库中实现高达 10 倍的查询性能提升
  • 在未压缩的数据大小上获得 10 倍的数据压缩(如果您对压缩感兴趣,请选中该COLUMNSTORE_ARCHIVE选项)

此外,根据您的 SQL Server 版本(如果 SQL Server 2017 或更高版本),您可以检查自适应查询处理,因为条件之一是拥有这样的索引:

在此处输入图像描述

您应该查看文档并根据您的 SQL Server 版本查看您有哪些选项,并确定该索引将如何影响性能,因为很有可能使事情变得更糟。

很好的是,微软在每篇文章中都提到了列存储索引类型可以永久使用的场景。

于 2017-11-13T08:04:35.260 回答