SQL Server中的列存储索引

时间:2017-11-13 07:44:44

标签: sql sql-server indexing columnstore

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

3 个答案:

答案 0 :(得分:1)

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

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

  

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

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

当您使用PAGE数据压缩时,columnstore中的

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

第二个好处是没有过滤任何内容的查询(或几乎没有过滤,需要(几乎)所有行)但需要只返回一些列

当表存储“每行”时,即使你只需要10列100,而你想要所有的行,整个表都会被读取,因为需要读取整行来获取你的10个请求列。使用“每列”存储时,只会读取所需的列。

当然,您可以使用包含的10个所需列来定义索引,但它将使用额外的空间以及维护此索引的开销。现在想象你的查询需要这10个,其​​他10个,以及另外10个,所以你需要为这些查询创建更多的索引。

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

答案 1 :(得分:0)

Columnstore Indexes,以列式格式存储数据,因此在使用聚合函数时它们非常有用。其中一个原因是,因为当您尝试聚合列时,同构数据压缩会快得多。

但这不是列存储索引的唯一用法。当您处理数百万行时(在多维数据模型中),它非常有用。 查看official documentationthis以便更好地理解。

答案 2 :(得分:0)

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

正如MSDN所述,可以使用它们:

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

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

enter image description here

您应该查看文档,看看您有哪些选项,具体取决于您的SQL Server版本,并测试该索引将如何影响性能,因为它很可能使事情变得更糟。

微软在每篇文章都提到了可以正常使用列存储索引类型的方案时,这是很好的。