我們知道,在SQL Server里,Page是數據存儲的基本單位,而數據行是實際數據的存儲單位,它們從Page Header之後就開始依次存儲在Page上。這種按行在Page上存儲記錄的方式就是行存儲。當數據是按單列而不是多行進行連續存儲時,就是所謂的列存儲。
基本介紹
- 中文名:列存儲
優勢
適用場合
主要特徵
(1)只須讀取需要的列。因此,從磁碟讀到記憶體中、然後從記憶體移到處理器快取中的數據量減少了。
(2)列經過了高度壓縮。這將減少必須讀取和移動的位元組數。
(3)大多數查詢並不會涉及表中的所有列。 因此,許多列從不會進入記憶體。 這一點與出色的壓縮方法相結合,可改善緩衝池使用率,從而減少總 I/O。
(4)高級查詢執行技術以簡化的方法處理列塊(稱為“批處理”),從而減少 CPU 使用率。
列存儲索引的局限性
(1)包含的列數不能超過 1024。
(2)無法聚集。 只有非聚集列存儲索引才可用。
(3)不能是唯一索引。
(4)不能基於視圖或索引視圖創建。
(5)不能包含稀疏列。
(6)不能作為主鍵或外鍵。
(7)不能使用 ALTER INDEX 語句更改。 而應在刪除後重新創建列存儲索引。
(8)不能使用 INCLUDE 關鍵字創建。
(9)不能包括用來對索引排序的 ASC 或 DESC 關鍵字。 根據壓縮算法對列存儲索引排序。 不允許在索引中進行排序。 可能按照搜尋算法對從列存儲索引中選擇的值進行排序,但是必須使用 ORDER BY 子句來確保對結果集進行排序。
(10)不以傳統索引的方式使用或保留統計信息。
(11)無法更新具有列存儲索引的表。
記憶體受限的影響:列存儲處理針對記憶體中處理進行了最佳化。 SQL Server 實現了若干機制,使得數據或大多數數據結構可以在可用記憶體不足時溢出到磁碟。 如果存在嚴重的記憶體限制,則處理過程將使用行存儲。 在某些實例中,可能會選擇列存儲索引作為訪問方法,但記憶體不足以生成所需數據結構。 通過先以列存儲操作開始,然後默認為一個較慢的代碼路徑,在查詢遇到嚴重記憶體限制時,可能會導致性能出現一定程度的降低。 任何查詢的有效記憶體要求取決於特定的查詢。生成列存儲索引要求的記憶體量大約為:8 MB×索引中的列數×DOP(並行度)。通常,記憶體要求隨著作為字元串的列的比例提高而增加。 因此,降低 DOP 可以減少生成列存儲索引所需的記憶體。
一些表達式的計算將比其他表達式更快:當使用列存儲索引時,應使用批處理模計算某些常見表達式,而不以一次一行的模式進行計算。 除了使用列存儲索引所帶來的優勢之外,批處理模式還將提供其他查詢加速效果。 並不為批處理模式處理啟用每個查詢執行運算符。
列存儲索引不支持 SEEK:如果查詢應返回行的一小部分,則最佳化器不大可能選擇列存儲索引(例如:needle-in-the-haystack 類型查詢)。如果使用表提示 FORCESEEK,則最佳化器將不考慮列存儲索引。
列存儲索引不能與以下功能結合使用:頁和行壓縮以及 vardecimal 存儲格式(列存儲索引已採用不同格式壓縮),複製,更改跟蹤,變更數據捕獲,檔案流。