【问题标题】:Column Store Indexes in SQL ServerSQL Server 中的列存储索引
【发布时间】:2017-11-13 07:44:43
【问题描述】:

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

【问题讨论】:

  • 谷歌了解什么是列存储索引。

标签: sql sql-server indexing columnstore


【解决方案1】:

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

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

列存储索引使用不同的数据存储格式,存储 按列而不是按行压缩数据。这个 存储格式有利于数据仓库中的查询处理, 报告和分析环境,尽管它们通常 读取大量行,查询仅使用 表中的列。

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

当您使用 PAGE 数据压缩时,列存储中的

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    但这并不是列存储索引的唯一用途。当您处理数百万行(在多维数据模型中)时,它真的很有帮助。 查看official documentation 和this 以获得更好的理解。

    【讨论】:

      【解决方案3】:

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

      正如MSDN所写,可以使用:

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

      此外,根据您的 SQL Server 版本(如果 SQL Server 2017 或更高版本),您可以检查Adaptive Query Processing,因为其中一个条件是拥有这样的索引:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多