SQL Server 2011中基於列的存儲方式

和大多數主流數據庫同樣,若是表擁有彙集索引,那麼SQL Server就會以B-樹的方式存儲,不然就會使用堆的方式存儲。這兩種方法本質上都是基於行的,其中每頁中行的條數會根據整體上行的大小不一樣而不一樣。從SQL Server 2011開始,微軟爲咱們提供了第三種選擇。SQL Server會提供一種「列存儲索引」,從而以列而不是行的方式來存儲數據。 科羅拉多上空的飛船軌跡

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