2016-10-03 71 views

回答

3

群集列存储索引是SQL Server 2014中的一项新功能。列存储索引允许以列状格式存储数据,而不是传统的基于行的存储。列存储索引(非集群)最初是在SQL 2012中引入的,以解决数据仓库/报告中典型的大量需求下的高查询性能。

要点:

  1. 它存储在柱状数据结构的数据,这有助于读取非常快。 以压缩格式存储数据,因此您的总IO成本将非常小。
  2. 列存储数据结构存储的数据和索引都在相同的数据结构,不同于单独存储数据和索引分开存放等,
  3. 这将是多个列的表,你选择每天只有有限的列非常有用,例如,如果有ProductSalesFact表,您通常选择该产品的销售量是多少,或者该季度的销售量是多少,尽管它有数百个列,但只能访问两个必需的列。

我在列存储索引博客里面提供300万条记录的性能研究与列存储VS rowstore

https://sqlserver101.wordpress.com/2016/01/25/why-clustered-columnstore-index-in-sql-server-2014/

MSDN链接,列存储的各种版本和路径:

https://msdn.microsoft.com/en-us/library/dn934994.aspx

2

假设不同表像下面col1作为主键

col1 col2 col3 
1  2  3 
4  5  6 

普通指数将存储像下面,假设一个页面只能容纳一排

row1 1 2 3--page1 
    row2 4 5 6--page2 

所以当你想要读取一些像sum(col3)这样的东西,SQLServer将需要读取page1以获得3和6,这是一个两页的开销。

现在有了列存储索引,相同的表将会像下面那样存储

page1 page2 page3 
1  2  3 
4  5  6 

现在,如果你想要做COL3的总和,它只是一个页面读取(第3页)

效益使用列存储索引时,你可能会碰到只需要网页从磁盘。记忆体是因为您不会存储不必要的数据

2

列存储索引很好地解释在这里:http://www.patrickkeisler.com/2014/04/what-is-non-clustered-columnstore-index.html

传统聚集和非聚集你提到的指数rowstore指数,其中数据库按行存储索引列。索引将分散在多个分区上,因此即使我们只选择一列,数据库仍然需要扫描所有分区才能获取数据,因此会产生大量的I/O。

Columnstore索引另一方面逐列存储索引。通常情况下,由于一列合并的数据并不那么大,因此这将使列中的所有数据都存储在一个分区内。现在,当我们从索引中选择1列时,数据库可以从一个分区返回数据,这减少了很多I/O。而且,列存储索引通常具有显着的压缩比,因此I/O效率更高,整个索引可以保存在内存中,这使查询速度提高了10倍到100倍。

列存储索引并不总是比rowstore更好。 Columnstore索引适用于像数据仓库和BI这样的场景,其中数据通常是批量处理的,例如聚合。但是,在经常搜索各行数据的情况下,它的性能比rowstore索引差。

有一点值得注意的是,非聚集列存储指数被更改锁定你的表(但也有一些变通的解决方案来改变数据),而聚集列存储指数仍然允许你编辑数据不会丢失或禁用索引。

有关此主题的更多信息,请参阅上面的文章,并尝试阅读MSDN文档。

相关问题