標籤:
傳統的關聯式資料庫服務引擎往往並不是對超大量資料進行分析計算的最佳平台,為此,SQL Server中開發了分析服務引擎去對大筆資料進行分析計算。當然,對於資料的存放平台SQL Server資料庫引擎而言,也是需要強大的資料處理能力的。
在SQL Server 2012時,SQL Server 引入了資料行存放區索引,用以顯著提供高傳統資料倉儲類型語句的效能,並在SQL Server 2014中做了進一步加強。本文將在對SQL Server 2012資料行存放區索引簡單介紹的基礎上,進一步解釋SQL Server 2014中資料行存放區索引發生的變化。
顧名思義,列儲存會將一個列的資料單獨存放在一起,因此主要會有以下兩個優點。
- 同一個列中的資料的相似性比較高,因此壓縮比例會更高。磁碟操作時,磁碟的IO也會相應的降低。當然,當壓縮的資料讀取到記憶體後解壓會需要額外的CPU。
- 由於資料是按照列進行儲存和讀取的,因此如果某些列在訪問中並不需要,那麼實際的操作時也會不訪問這些列,那麼磁碟IO會進一步降低。
我們知道,CPU,memory和磁碟三者中磁碟的速度最慢。因此往往磁碟是效能問題的主要瓶頸。通過使用資料行存放區索引,會大大減少磁碟的IO操作,加之SQL Server會使用一些特殊的執行模式等等,大批量的資料彙總訪問等會較以往的行儲存更快,使用者可以得到顯著地效能提升。
但是如果僅僅是需要尋找某一行或者某些行,通過傳統的index seek即可直接完成的話,那麼反而是傳統行儲存中的index seek更佳。
SQL Server 2012的列索引主要有以下特性
- 當載入了資料行存放區索引以後,不但索引本事是唯讀,無法修改,底層的堆表或者叢集索引的資料也無法修改
- 建立資料行存放區索引時需要的記憶體往往會比傳統的索引需要的更多
- 與indexed views, filtered indexes, sparse columns, computed columns不相容
- 支援常見的資料類型,但是例如varchar(max),uniqueidentifier等是不支援的
- 資料壓縮比很高
- 資料預讀比例很高
- 操作的資料單元稱之為 batch
- 語句執行是基於向量(Vector-based)的
- 語句在被編譯時間會自動考慮到使用資料行存放區索引
SQL Server 2014的列索引主要有以下特性
=========================================
在SQL Server2014時,SQL Server對資料行存放區索引進行了進一步的開發,使得其能夠支援更新操作。主要的進步如下。
- 支援資料的讀和寫
- 在打破了資料唯讀限制後,資料行存放區索引使用的範圍和情境大大增加
- 相比傳統的ad-hoc的增刪改操作,在SQL Server2014還是推薦使用bulk insert和分區交換來進行大批次資料的更新,效率更高,維護成本也會降低
- 支援更多的資料類型
- 添加了更多的資料類型支援:(n)varchar(max), varbinary(max), XML, Spatial, CLR
- 基本說來,SQL Server2014的列儲存支援所有的non-blob資料類型
- 整個表可建立並且只能建立一個聚集資料行存放區索引。傳統的行儲存會需要非叢集索引協助提高訪問效率,但是列儲存無需這樣。並且由於只有一份資料,因此儲存需要的磁碟空間大大降低
- 非聚集列索引仍然支援,並且還是唯讀結構。
當我們有了聚集資料行存放區索引後,就不需要非聚集列索引了,因為此時所有的資料都是按照列儲存了。但是如果表上需要添加Constraints或者工作負載仍然需要B-tree形式的非叢集索引,那麼我們還是只能考慮使用非聚集資料行存放區索引。
- 語句的執行上有以下改進
- 基於向量的計算方式得到改
- 支援更多的文法
- 所有的join方式(包括OUTER, HASH, SEMI (NOT IN, IN)
- UNION ALL
- Scalar aggregates
- “Mixed mode” plans
- 對bitmap和spill操作有進一步的改進
- 對hash join有所改進
可以看出,無論是功能性的角度還是效能的角度,SQL Server2014的columnstore index都是有巨大的進步的。
下面的就SQL Server2014 如何?資料行存放區索引的資料修改操作加以簡單描述
==========================================
首先我們來認識下儲存索引中設計的概念:
- Column store – 資料邏輯上組織為一個包含行和列的表,但是實際的資料是按照列進行儲存的。
- Row store – 資料在邏輯上組織為一個包含行和列的表,並且物理上也是一行一行資料進行儲存。
- Row groups and column segments - 列儲存時,整個表中資料會首先按照一定的行數對錶進行切割,分成幾組,稱之為row group。對每一個row group中的資料,會單獨儲存每一列。Row group中的每一個列稱之為一個column segment。
- nonclustered columnstore index – 非聚集資料行存放區索引基於堆表或者叢集索引而建立的唯讀索引,因此索引包含的列中資料實際儲存兩份,底層表也是出於唯讀模式。
上述的概念在SQL Server 2012、2014中的資料行存放區索引中是一樣的。
SQL Server 2014的資料行存放區索引添加了下面新的內容:
- Clustered columnstore inde - 整個表都按照列儲存進行組織,直接替代了傳統的堆表或者叢集索引,可以自由的進行增刪改操作。
- Delta store -
聚集資料行存放區索引雖然相對於非聚集資料行存放區索引在column store這塊組織架構基本一樣,但是它可以進行增刪改操作。原因是它多了一塊或者多塊行儲存部分,這部分稱之為delta tore。
新插入的資料是直接載入到delta store中的刪除操作只是將資料標識為刪除,實際的刪除需要在rebuild時完成。
更新操作會拆分為一個刪除操作和一個插入合并完成。
如果一個bulk insert的批次插入的量小於100000,那麼資料會載入到delta store中,否則會載入到columnstore中。
當delta store中資料量超過100 0000後,“Tuple mover” 會將其中資料進行歸總放置到column store中。
是聚集資料行存放區索引的一個。
原文連結:http://blogs.msdn.com/b/apgcdsd/archive/2015/01/02/sql-2014-8-updateable-column-store-indexes.aspx
在SQL Server 2014裡可更新的資料行存放區索引 (Updateable Column Store Indexes)