?
???
優點和使用場景
SQL Server 內存中列存儲索引通過使用基于列的數據存儲和基于列的查詢處理來存儲和管理數據。 列存儲索引適合于主要執行大容量加載和只讀查詢的數據倉庫工作負荷。 與傳統面向行的存儲方式相比,使用列存儲索引存檔可最多提高 10 倍查詢性能,與使用非壓縮數據大小相比,可提供多達 7 倍數據壓縮率。
SQL 2012和SQL 2014列存儲索引的比較
在SQL server 2012中,一旦啟用了列存儲索引,將不能夠對已啟用列存儲索引的數據存儲執行變更寫入操作,也就是說列存儲索引適合查詢只讀的或者基本不發生變化的存檔數據。一旦對表添加了列存儲索引,表就變成了只讀的了。如果我們需要進行Insert、Update、Delete等操作,我們需要先禁用列存儲索引,然后進行表操作,最后再重建列存儲索引。這個特性,使得列存儲索引更適合存放靜態數據的數據倉庫。
但是這一情況在SQL server 2014中已經有所改善。該技術能夠將數據倉庫的查詢性能提升數倍。不同于普通的索引或堆采用B-Tree結構(以行的形式),列存儲索引以列的形式存儲數據,并使用主動壓縮以減少查詢請求所需的磁盤I/O。但是在SQL Server 2012中列存儲索引仍有很多限制,SQL Server 2014中增強了該技術,并打破之前版本的限制。在SQL Server 2014創建列存儲索引時不會影響表的寫入功能,這意味著用戶可以在一個有列存儲索引的表中發出INSERT、UPDATE、DELETE等指令。SQL Server 2012中用戶在表里只能創建非聚簇列存儲索引,在單一索引中包含表中所有列。SQL Server 2014增加了對創建聚簇列存儲索引的支持。用戶仍然可以像在SQL Server 2012中那樣創建一個非聚簇列存儲索引,但是這個非聚簇列存儲索引是只讀查詢,無法更新。只有聚簇列存儲索引才可以更新。
參考資料:
http://tech.it168.com/a2013/0829/1527/000001527798.shtml
行存儲的缺點
SQL Server在處理查詢時通常是提取全部索引頁,包括查詢中用不到的那部分,也就是說,讀取所有列的記錄,即便是有些不需要。把不需要的數據讀取出來,不僅浪費大量內存,同時也增大I/O,對系統的整體性能有著很大的影響。
列存儲的優勢
假定我們有一張有3列數據的表,這3列從左往右依次是int、varchar和bool類型,并且該表有100條(行)記錄。對于都是int類型的第一列數據,應用壓縮算法是很容易的,同時壓縮率也會很高。這也將表明,我們不必訪問該表的所有列,僅需訪問感興趣的相關列的子集,這從另一方面來講,可以減少磁盤的I/O、提升緩存,因此,磁盤存儲會被更加高效低利用,就像索引維護一樣。
列存儲索引查詢示意圖
? ?
圖一(微軟官方)
?
圖二(來源網絡)
來源:http://www.uml.org.cn/sjjm/201212141.asp
列存儲索引能夠提供更快查詢的三個原因(來源網絡)
第一個原因:因為索引中的列數據被壓縮了,它占用的空間更小,因此SQL Server只需掃描更少的頁。
第二個原因,因為只需要掃描更少的頁,SQL Server就可以把它們保留在內存中,大大地提高了數據停留在內存緩沖區的可能性。因此,在那些內存大的系統中,你會看到更大的性能差異,尤其是當索引被掃描多次并且相應的行存儲索引不能裝入內存時更明顯。
第三,SQL Server只需要提取查詢中用到的列的索引頁,而常規索引需要提取全部索引頁,包括查詢中用不到的那部分。因此,你又一次得到了益處,更少的頁需要處理,就會更快得到結果,同樣SQL Server也更可能把列緩存保持在內存緩存區中。