SQL Server 2012中的ColumnStore Index尝试
?費了半天勁,今天終于裝好SQL Server2012了。按照MSDN中的新特性資料(Columnstore Indexes for Fast DW QP SQL Server 11)。嘗試了下ColumnStore Index。ColumnStore Index按照其字面意思所示。是基于列存儲的索引。這個概念如圖1所示。
???
??? 圖1.ColumnStoreIndex和基于行的Index比較
?
??? ColumnStoreIndex是按照列存入頁當中,而不是按照傳統的以行為單位存入頁。因此帶來的好處可以歸結如下:
- ???? 以往的數據按照行存儲,select哪怕只有一列,也會將整個行所在的頁提取出來,而使用基于列的索引,僅僅需要提取select后面的列。提高了性能。
- ???? 壓縮更容易
- ???? 緩存命中率大大提高,因為以列為存儲單位,緩存中可以存儲更多的頁(緩存常用的列,而不是整個行)
??
??? 微軟號稱自己是第一個支持“純”列存儲的主流數據庫。其他數據庫我不甚了解,有知道的同學可以反駁下……
?
??? 使用ColumnStore Index不能像使用其它非聚集索引那樣沒有限制,使用ColumnStoreIndex的限制如下:
??? 1.一個表只能有一個ColumnStore Index
??? 2.不能使用過濾索引
??? 3.索引必須是partition-aligned
??? 4.被索引的表變成只讀表
??? 5.被索引的列不能是計算列
??? 6.不能使用Include關鍵字
?
??? 因此可以看出,中小型的OLTP環境基本和這個功能無緣。ColumnStore Index貌似適用于OLAP和讀寫分離用。
??? 下面我們來看一些使用ColumnStore Index的實例
?
建立ColumnStore Index和對ColumnStore Index所在表數據進行更改
??? 建立ColumnStore Index和建立普通的非聚集索引看起來基本沒有區別,僅僅是多加了一個ColumnStore關鍵字,如圖2所示。
??
??? 圖2.建立ColumnStore Index的表后對其插入數據失敗
?
?? 如果要對有ColumnStore Index的表進行數據更改,則需要在停用ColumnStore Index后,插入數據,完成后,重建ColumnStore Index,如圖3所示。
???
??? 圖3.對有ColumnStore Index的表進行數據插入
???
ColumnStore Index查詢性能測試
??? ColumnStore Index帶來的最大好處是查詢性能的增加。下面來進行測試。在剛才圖1中所建的表中插入100萬條從1到1000的隨機數,如圖4所示。
???
??? 圖4.插入100萬條測試數據
?
??? 然后在Data列上分別建立ColumnStore Index和普通的非聚集索引,如圖5所示。
???
??? 圖5.分別建立兩個索引
?
??? 然后分別利用這兩個索引做一次聚合查詢,測試結果發現使用ColumnStore Index對IO的占用大大的減少了。如圖6所示。
???
??? 圖6.使用兩種索引的性能對比
?
??? 所對應的執行計劃如圖7所示。
???
??? 圖7.兩種索引的執行計劃
?
??? 可以看出,使用ColumnStore Index對性能的提升是巨大的。
?
總結
??? 本文通過對ColumnStore Index做了簡單的介紹后,做了簡單的測試得出,使用ColumnStore Index對性能的提升是巨大的,但由于ColumnStore Index的使用受到諸多限制。目前只能在OLAP環境中使用。更多的使用場景未來再看吧。
轉載于:https://www.cnblogs.com/qanholas/archive/2013/03/08/2949207.html
總結
以上是生活随笔為你收集整理的SQL Server 2012中的ColumnStore Index尝试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++内存中字节对齐问题详解
- 下一篇: MvvmLight:Command