SQL Server 2016:內存列存儲索引
SQL Server 2016的一項新特性是可以在“內存優化表(Memory Optimized Table)”上添加“列存儲索引(Columnstore Index)”。要理解這是什麼意思,我們應該首先解釋術語列存儲索引和內存優化表。
列存儲索引是一種按照列而不是行組織數據的索引。每個數據塊只存儲一個列的數據,最多包含100萬行。因此,如果數據爲5列1000萬行,那麼就需要存儲在50個數據塊中。當只查詢部分列時,這種數據組織策略特別有效,因爲數據庫不會從磁盤讀取用戶不關心的列。
列存儲索引比表掃描要快得多,但沒有傳統的B樹索引那麼快。這特別適合於那種無法預測需要什麼索引的即時報表。
內存優化表正如它的名字, 它是一個經過優化並一直駐留在內存中的表。這有許多好處,比如鎖無關寫,但它也有很大的侷限性。比如,只允許有8個索引,這對於用於即時查詢的表而言限制太大。
SQL Server 2016部分地彌補了這種限制,它允許那8個索引中的其中一個爲列存儲索引。但要遵循如下規則:
像內存優化表上的其它索引一樣,列存儲索引必須在表創建時定義。
列存儲索引必須包含基表中的所有列。(在普通表上的列存儲索引不存在這種限制。)
列存儲索引必須包含基表中的所有行。換言之,它不能是“篩選索引(filtered index)”。
一個與內存優化表相關的特性是創建本地編譯查詢。數據庫使用C編譯器將這些查詢編譯成了機器碼,而不使用SQL Server解釋器。使用列存儲索引的查詢可以使用這個選項,而不用總是通過解釋器運行。