SQL Server 2012:列存储索引如何一次提供多个列?

时间:2012-03-18 18:34:57

标签: sql sql-server database sql-server-2012 columnstore

假设我们有下表:

CREATE TABLE T (
 ID INT,
 String1 nvarchar(400),
 String2 nvarchar(400)
)

一个查询:

select String1, String2, count(*)
from T
group by String1, String2

如果T被column-store index索引,则此分组查询通常由非群集列存储索引扫描驱动。

如果列存储索引以逐列格式存储行,并且每个列都单独排序,那么它怎么能一次为每行提供多个列?这似乎是不可能,因为各列按不同的排序顺序排序。我想不出任何方法可以将各列合并回一个包含两列的完整行(本例中为String1,String2)。

这如何在内部发挥作用?

1 个答案:

答案 0 :(得分:2)

每个列都是单独存储的,因此系统必须对列索引进行多次访问(每列选择一个),然后在内部将结果连接在一起以返回最终查询结果。这仍然非常有效,因为列存储索引会显着减少所需的I / O,尽管查询的大量列可能会很慢。