SQL Server On Linux(26)——SQL Server on Linux 性能(10)——列存儲索引簡介

本人新書上市,請多多關照:《SQL Server On Linux運維實戰 2017版從入門到精通》

在這裏插入圖片描述

本文介紹SQL On Linux上的性能提升功能,列存儲索引,實際上這個並不僅僅是Linux上纔有,所有平臺的SQL Server包括windows、linux和雲平臺都有,而且在本人工作中用了不少,所以做個技術分享。

前言

  在SQL 2012之前,我們能用到的所有索引都是“行存儲索引”,SQL 2012首次引入列存儲索引。首先,列存儲是數據以邏輯上組織成一個行列形式的表,但是物理存儲上又是按照按列的數據方式存儲的。
  相對來說,行存儲是物理和邏輯上都按行的方式存儲數據的格式。它是SQL Server表和索引的標準存儲結構。
  列存儲索引,通過按列存儲的結構,大幅度提升性能(體現在大幅度降低實際存儲空間)。其中涉及了高效的數據壓縮,數據消除和批模式模式(batch mode execution)。
  列存儲首先強項是壓縮,而且是垂直壓縮,雖然壓縮功能從2008已經有,但是是基於行壓縮,本人公司的項目中,數據表的列可多大4~600列,這種寬表的行壓縮往往是失敗的。因爲超過了8096bytes的限制。而列壓縮就沒有這種限制。因爲它已經是全新的壓縮模式。如果能搭配in-memory內存技術,效果會更加好。壓縮使得數據更小,很有可能完全加載到內存中而不引入額外的磁盤I/O,從而大幅度提升空間利用率,而且更小的空間使得索引的體積更小,從而進一步提升索引的效率。正如我以前說過的,在這些年來我個人的經驗總結裏面,性能優化實際上就是一個字“少”。

基礎概念

  前面的文章提到過列存儲的性能測試,但是沒有從頭說起,所以這裏補一下。列存儲的核心概念有下面幾個,請不要忽視概念,因爲在troubleshooting的過程中,很多概念的東西反而能幫你理清思路和減少彎路。

  1. 行組(rowgroup):一個行組內的行,可以被同時壓縮成一個列存儲格式並組合在一起。每個行組通常可包含的最大行數是 1,048,576 行。
  2. 片段(segment):在行組中,數據列的一個區間。每個行組中的每列包含一個segment,最終組成列存儲索引。SQL Server首先把數據切片成行組,然後在組內壓縮每個片段。
  3. 聚集列存儲索引(clustered columnstore index):整個表都以一個列存儲索引來存儲,此後你不能創建常規的聚集索引,但是可以創建常規的非聚集索引。
  4. 非聚集列存儲索引(nonclustered columnstore index):某些列組成一個索引,以列存儲的格式存在基本表上面。這個時候可以創建常規的行存儲聚集索引。
  5. 增量行組(delta rowgroup):少量數據進入聚集列存儲索引之前,會先放到增量行組中,知道填滿102400行時才進行一次性壓縮。這個增量行組由SQL Server自動創建,因此一旦增量行組達到了足夠的數量,就會壓縮成一個列存儲行組。

  列存儲之所謂高效,主要在下面三個特點:

  1. 壓縮:聚集列存儲索引是表的本身,通常可以把堆表的體積降低到原來的1/5~1/8,有些可以到1/10。這是的數據可以更容易地完全載入內存,同時經過業界的努力,列存儲的壓縮算法是很高效的。
  2. 數據消除:Data elimination,當數據以列形式存儲時,SQL Server可以在查詢中跳過不必要的列。另外SQL Server還能知道列片段中哪些行組是查詢所需的。這個概念成爲行組消除。有點像分區的分區消除。
  3. 批執行模式:Batch Mode execution,這個是從列存儲出現以後纔出現的。用於查詢優化器一次性處理多個相關行而不是傳統的一行一次。這種方式可以極大提高性能。另外從SQL 2017引入的adaptive query processing(自適應查詢處理)可以通過這種方式,提供智能查詢執行。

何時使用

  每當出現新功能,我總會被問到什麼時候用這些新功能?簡單來說就是什麼時候使用列存儲索引,什麼時候使用傳統的聚集或非聚集b-tree索引,也叫行存儲索引。
  對於聚集列存儲索引。首先要了解你的系統負載,是否何時使用聚集列存儲索引,聚集列存儲索引最合適針對數據倉庫,絕大部分以讀爲主。如果不是數據倉庫,通常不需要用到聚集列存儲索引。
  對於非聚集列存儲索引。那什麼時候用呢?它挺適合OLPT類型的系統,但是最合適那些範圍查詢而不是精確查詢,同時範圍查詢也應該包含比較多的數據,如果非要給一個值,可能是超過100行。另外也儘量針對select和where中出現的列進行索引化而不是全表使用一個非聚集列存儲索引。這種工作負載通常叫做混合事務分析處理(Hybrid Transactional Analytical Processing, HTAP), 官方也叫實時操作分析。如果測試結果並沒有明顯問題,那麼優先建議使用列存儲索引來應對這種負載,詳細內容可以看官方文檔“根據需要選擇最佳的列存儲索引
  對於行存儲索引,同樣可以看上面的文章。

小結

  本篇以簡介爲基礎,後面的文章逐步深入介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章