2012-03-18 73 views
2

比方說,我們有如下表:SQL Server 2012:列存儲索引如何一次提供多個列?

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

列存儲索引的內部現在還沒有很好的記錄(並且不確定它們是否會像文檔反覆提到專有方法一樣)。你可能會發現[這個答案](http://dba.stackexchange.com/a/10529/3690)(和評論中的鏈接)有用。功能點演示講述了段密鑰和連接索引。 – 2012-03-18 21:32:39

回答

2

每列都單獨存儲,因此係統必須對列索引(每列選擇一個)執行多次訪問,然後將內部結果一起返回到最終查詢結果。這仍然非常有效,因爲列存儲索引大大減少了所需的I/O,儘管查詢的大量列可能很慢。