程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2011中基於列的存儲方式

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

編輯:關於SqlServer
和大多數主流數據庫一樣,如果表擁有聚集索引,那麼SQL Server就會以B-樹的方式存儲,否則就會使用堆的方式存儲。這兩種方法本質上都是基於行的,其中每頁中行的條數會根據總體上行的大小不同而不同。從SQL Server 2011開始,微軟為我們提供了第三種選擇。SQL Server會提供一種“列存儲索引”,從而以列而不是行的方式來存儲數據。

  當使用數據規模為1TB、記錄條數為十四億四千萬的表時,微軟聲稱基於列的查詢在CPU時間上會有16倍的提升,而在使用時間上會有455倍的提高。在真實情況下,這意味著本來要耗費501秒的查詢,現在只需要1.1秒就可以完成了。這項測試是在擁有32個邏輯處理器和256GB內存的計算機上執行的。

  微軟把每個列都隔離在自身的一組頁中,從而達到了這種驚人的改善。當執行查詢的時候,只會從磁盤載入位於結果集中的列。而包含其它列的頁會被忽略。

  這種方法相當於為每種我們所能想象到的列組合創建替代索引。然而,這種方式不會消耗大量的磁盤空間,它實際上會比傳統的表占用更小的空間。由於SQL Server的壓縮會發生在頁級別上,並且和行相比,列中的數據更容易重復,所以使用列存儲索引的表將會擁有更高的壓縮等級。

  但暫時我們還不能輕易決定使用列存儲索引。首先也是最重要的,它們是不可更新的。一旦創建了列存儲的索引,那麼就不允許在表上執行插入、更新或者刪除等操作了。微軟期望更多商店每天對數據進行刷新,否則就需要把數據做只讀處理。在刷新周期中,我們會刪除索引,更新數據,然後再重新建立索引。由於這肯定是代價昂貴的操作,所以我們可以使用垂直分區來把操作限制到邏輯表的子集范圍內。

  使用列存儲的索引也會導致性能的降低。如果你使用大多數列,那麼重新組合行會耗費大量的資源。這意味著OLTP樣式的查詢應該避免這種方式,而對於OLAP形式的查詢,這種方式會比較有利。或者換句話說,如果你在編寫“SELECT *”或者每次抓取一行數據,那麼列存儲索引就不適合你。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved