當使用數據規模為1TB、記錄條數為十四億四千萬的表時,微軟聲稱基於列的查詢在CPU時間上會有16倍的提升,而在使用時間上會有455倍的提高。在真實情況下,這意味著本來要耗費501秒的查詢,現在只需要1.1秒就可以完成了。這項測試是在擁有32個邏輯處理器和256GB內存的計算機上執行的。
微軟把每個列都隔離在自身的一組頁中,從而達到了這種驚人的改善。當執行查詢的時候,只會從磁盤載入位於結果集中的列。而包含其它列的頁會被忽略。
這種方法相當於為每種我們所能想象到的列組合創建替代索引。然而,這種方式不會消耗大量的磁盤空間,它實際上會比傳統的表占用更小的空間。由於SQL Server的壓縮會發生在頁級別上,並且和行相比,列中的數據更容易重復,所以使用列存儲索引的表將會擁有更高的壓縮等級。
但暫時我們還不能輕易決定使用列存儲索引。首先也是最重要的,它們是不可更新的。一旦創建了列存儲的索引,那麼就不允許在表上執行插入、更新或者刪除等操作了。微軟期望更多商店每天對數據進行刷新,否則就需要把數據做只讀處理。在刷新周期中,我們會刪除索引,更新數據,然後再重新建立索引。由於這肯定是代價昂貴的操作,所以我們可以使用垂直分區來把操作限制到邏輯表的子集范圍內。
使用列存儲的索引也會導致性能的降低。如果你使用大多數列,那麼重新組合行會耗費大量的資源。這意味著OLTP樣式的查詢應該避免這種方式,而對於OLAP形式的查詢,這種方式會比較有利。或者換句話說,如果你在編寫“SELECT *”或者每次抓取一行數據,那麼列存儲索引就不適合你。