適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 資料庫
瞭解每個 SQL Server 版本可用的資料行存放區功能,以及最新版的 SQL Database、Azure Synapse Analytics 和 Analytics Platform System (PDW)。
產品版本的功能摘要
本表總結了列存儲索引的重要功能以及其可用產品。
| 列存儲索引功能 | SQL Server 2016 (13.x)1 | SQL Server 2017 (14.x) | SQL Server 2019 (15.x) | SQL Server 2022 (16.x) | SQL Server 2025 (17.x) | Azure SQL Database2 和 Azure SQL 受控實例AUTD | Azure Synapse Analytics 專用 SQL 集區 |
|---|---|---|---|---|---|---|---|
| 多線程查詢的批次模式執行3 | yes | yes | yes | yes | yes | yes | yes |
| 單一執行緒查詢的批次執行模式 | yes | yes | yes | yes | yes | yes | yes |
| 封存壓縮設定選項 | yes | yes | yes | yes | yes | yes | yes |
| 快照隔離和讀寫提交快照隔離 | yes | yes | yes | yes | yes | yes | yes |
| 建立資料表時指定資料行存放區索引 | yes | yes | yes | yes | yes | yes | yes |
| AlwaysOn 支援資料行存放區索引 | yes | yes | yes | yes | yes | yes | yes |
| Always On 可讀次要節點支援唯讀的非叢集列存儲索引 | yes | yes | yes | yes | yes | yes | yes |
| AlwaysOn 可讀取次要支援可更新的資料行存放區索引 | yes | yes | yes | yes | yes | ||
| 堆積或 B-tree 的唯讀非叢集資料行存放區索引 | 是的, 4 | 是的, 4 | 是的, 4 | 是的, 4 | 是的, 4 | 是的, 4 | 是的, 4 |
| 堆疊或 B 樹中可更新的非叢集列存儲索引 | yes | yes | yes | yes | yes | yes | yes |
| 在具有非叢集欄存索引的堆積或 B 樹上,允許新增其他的 B 樹索引。 | yes | yes | yes | yes | yes | yes | yes |
| 可更新的叢集列存儲索引 | yes | yes | yes | yes | yes | yes | yes |
| 叢集列存儲索引的 B-tree 索引 | yes | yes | yes | yes | yes | yes | yes |
| 記憶體最佳化資料表的資料行存放區索引 | yes | yes | yes | yes | yes | yes | yes |
| 非聚集列存儲索引定義支援使用篩選條件 | yes | yes | yes | yes | yes | yes | yes |
在 CREATE TABLE 和 ALTER TABLE 中的列存索引壓縮延遲選項 |
yes | yes | yes | yes | yes | yes | yes |
| 支援 nvarchar(max) 類型 | yes | yes | yes | yes | yes | 第五號 | |
| 列存儲索引可以具有非持久化的計算欄位 | yes | yes | yes | yes | |||
| Tuple Mover 背景合併支援 | yes | yes | yes | yes | yes | ||
| 已排序的叢集資料行儲存索引 | yes | yes | yes | yes | |||
| 已排序的非叢集列存索引 | yes | yes | |||||
| 線上列存儲索引建立和重建 | yes | yes | yes | ||||
| 在線排序的數據行存放區索引建立和重建 | yes | yes |
1 針對 SQL Server 2016 (13.x) SP1 和更新版本,所有版本都可以使用數據行存放區索引。 針對 SQL Server 2016 (13.x) 和舊版,數據行存放區索引只能在 Enterprise Edition 中使用。
2 針對 Azure SQL Database,數據行存放區索引可在 DTU 進階層、DTU 標準層 - S3 和更新版本,以及所有虛擬核心層中使用。
3批次模式 作業的平行處理度在 SQL Server Standard Edition 中限製為 2,而在 SQL Server Web 和 Express 版本中限制為 1。 此限制指的是在磁碟式資料表和記憶體最佳化資料表上建立的資料行存放區索引。
4 若要建立唯讀非叢集數據行存放區索引,請將索引儲存在唯讀檔案群組上。
5 不支援於專用 SQL 集區中,但支援於無伺服器的 SQL 集區。
SQL Server 2025 (17.x)
SQL Server 2025(17.x)新增了以下功能:
已排序的非叢集數據行存放區可改善即時作業分析中的查詢效能。
如需詳細資訊,請參閱使用已排序的數據行存放區索引 效能微調。
現在可以在線建立或重建已排序的數據行存放區索引(叢集或非叢集)。
當
ONLINE = ON子句存在時,您可以在 CREATE INDEX 語句中指定ORDER。 如需線上索引作業的詳細資訊,請參閱 線上執行索引作業。改善有序叢集列存儲索引的排序品質。
在 SQL Server 2025(17.x)中,當線上建立有序叢集欄位儲存索引時,排序演算法會用
tempdb來取代記憶體中的資料排序。 如果MAXDOP索引組建為 1,組建會產生沒有重疊區段的完整排序叢集數據行存放區索引。這可以改善使用索引的查詢效能。 不過,由於建置索引需要進行額外的 I/O 操作來處理溢出至
tempdb,因此可能會花費更長的時間。如果叢集數據行存放區索引已經存在,查詢可以在完整排序的在線索引重建進行時繼續使用。
改善的資料庫和檔案壓縮作業。
在舊版 SQL Server 中,當叢集數據行存放區索引包含任何具有 LOB 資料類型的數據行,例如 varchar(max)、nvarchar(max)、varbinary(max)時,這些數據行所使用的數據頁無法由壓縮作業移動。 因此,縮小在數據檔中回收空間的效果可能較不理想。
在 SQL Server 2025(17.x)中,這兩個
DBCC SHRINKDATABASEandDBCC SHRINKFILE指令都可以移動欄位儲存索引中 LOB 欄位所用的資料頁面。
SQL Server 2022 (16.x)
SQL Server 2022 (16.x) 已新增這些功能:
- 已排序的叢集資料行存放區索引會根據已排序的資料行述詞改善查詢的效能。 已排序的資料行存放區索引可藉由完全略過資料區段來改善效能。 這可大幅減少完成資料行存放區資料查詢所需的 IO。 如需詳細資訊,請參閱區段刪除。 如需詳細資訊,請參閱 CREATE COLUMNSTORE INDEX 和 使用已排序的列存儲索引進行效能微調。
- 利用叢集資料列存儲結構中對字串的資料列群組消除技術,進行述詞下推,以邊界值來優化字串搜尋。 所有資料行存放區索引都可利用依資料類型刪除區段的增強功能。 從 SQL Server 2022 (16.x)開始,這些段落消除功能擴展至字串、二進位和 GUID 資料類型,以及其精度大於二的 datetimeoffset 資料類型。 先前,列存儲區段消除只會套用至數值、日期和時間數據類型,以及 datetimeoffset 資料型別,當其小數位數不超過兩位時。 升級至支援字串最小/最大區段消除的 SQL Server 版本之後(SQL Server 2022 (16.x) 和更新版本),數據行存放區索引在使用
ALTER INDEX REBUILD或CREATE INDEX WITH (DROP_EXISTING = ON)重建之前,不會受益於此功能。 - 列存儲對以
LIKE謂詞為前綴的行組消除,例如column LIKE 'string%'。LIKE的非前綴使用不支援區段消除,例如column LIKE '%string'。 - 如需新增功能的詳細資訊,請參閱 SQL Server 2022 的新功能。
SQL Server 2019 (15.x)
SQL Server 2019 (15.x) 新增下列功能:
Functional
從 SQL Server 2019 (15.x) 開始,Tuple Mover 受到背景合併任務的幫助,此任務會自動壓縮已根據內部閾值存在一段時間的較小 OPEN delta 資料列群組,或合併因刪除大量資料列而形成的 COMPRESSED 資料列群組。 之前,需要進行索引重新組織作業,才能合併包含部分刪除之資料的資料列群組。 這可隨著時間推移逐漸改善資料行存放區索引的品質。
SQL Server 2017 (14.x)
SQL Server 2017 (14.x) 新增下列功能。
Functional
- SQL Server 2017 (14.x) 支援在叢集列存儲索引中使用非持久計算資料行。 不支援叢集資料行存放區索引中的持久性計算資料行。 您無法在計算資料行上建立非叢集資料行存放區索引。
SQL Server 2016 (13.x)
SQL Server 2016 (13.x) 新增索引鍵增強功能,以改善資料行存放區索引的效能和彈性。 這些改善會強化資料倉儲案例,並進行即時作業分析。
Functional
行式儲存資料表可以有一個可更新的非群集欄式儲存索引。 之前,非叢集資料行存放區索引是唯讀的。
非叢集資料行存放區索引定義支援使用篩選條件。 若要將 OLTP 資料表新增資料行存放區索引對效能的影響降到最低,請使用篩選條件,僅在作業負載中的冷資料上建立非叢集資料行存放區索引。
記憶體中的資料表可以有一個欄儲索引。 您可以在建立資料表時建立此索引,或之後再使用 ALTER TABLE (Transact-SQL) 新增。 從前,只有基於磁碟的資料表可以有列存儲索引。
叢集資料行存放區索引可以有一或多個非叢集資料列存放區索引。 資料行存放區索引以前不支援非叢集索引。 SQL Server 會自動維護 DML 作業的非叢集索引。
使用 B-tree 索引支援主鍵和外鍵,並在叢集列存索引上強制執行這些約束。
列存儲索引有一個壓縮延遲選項,可將即時運行分析中的交易工作負載影響降到最低。 此選項允許經常變更的資料列穩定後,再壓縮到資料行存放區。 如需詳細資訊,請參閱 CREATE COLUMNSTORE INDEX (Transact-SQL) 和開始使用資料行存放區進行即時作業分析。
資料庫相容性等級 120 或 130 的效能
資料列儲存索引支援讀取已認可快照隔離級別 (RCSI) 和快照隔離 (SI)。 這可讓交易式一致性分析查詢沒有任何鎖定。
欄儲支援索引碎片整理,透過移除已刪除的資料列,且不需要明確重建索引。
ALTER INDEX ... REORGANIZE陳述式根據內部定義的政策,作為線上操作,從資料欄儲存中移除已刪除的資料列。您可以在 Always On 可讀的次要複本上存取資料行存放區索引。 您可將分析查詢卸載到 Always On 次要複本,以改善作業分析的效能。
當資料類型使用不超過 8 個位元組,且不是字串類型時,彙總下推會在資料表掃描期間計算彙總函式
MIN、MAX、SUM、COUNT和AVG。 無論是否使用GROUP BY子句,叢集資料行存放區索引和非叢集資料行存放區都支援彙總下推。 在 SQL Server 上,這項增強功能保留給 Enterprise Edition 使用。字串述詞下推技術可以加速對 VARCHAR/CHAR 或 NVARCHAR/NCHAR 字串類型進行比較的查詢。 這適用於常見的比較運算子,並包括像是使用點陣圖篩選的運算子
LIKE。 此功能適用於所有支援的排序規則。 在 SQL Server 上,這項增強功能保留給 Enterprise Edition 使用。利用向量型硬體功能增強批次模式作業。 資料庫引擎會偵測 AVX 2 (Advanced Vector Extensions) 和 SSE 4 (Streaming SIMD Extensions 4) 硬體擴充功能的 CPU 支援層級,並在支援的情況下使用。 在 SQL Server 上,這項增強功能保留給 Enterprise Edition 使用。
資料庫相容性等級 130 的效能
新的支援功能允許對於使用這些操作中任一個的查詢執行批次模式。
SORT- 具有多個不同功能的聚合。 部分範例:
COUNT/COUNT、AVG/SUM、CHECKSUM_AGG、STDEV/STDEVP - 視窗彙總函式:
COUNT、COUNT_BIG、SUM、AVG、MIN、MAX和CLR - 視窗使用者定義彙總:
CHECKSUM_AGG、STDEV、STDEVP、VAR、VARP和GROUPING - 視窗彙總分析函式:
LAG、LEAD、FIRST_VALUE、LAST_VALUE、PERCENTILE_CONT、PERCENTILE_DISC、CUME_DIST和PERCENT_RANK
單一執行緒查詢若在
MAXDOP 1執行或採用序列查詢計畫,則會以批次模式運行。 先前,只有多執行緒查詢會以批次方式執行。在 SQL InterOp 模式中,記憶體最佳化資料表查詢可以在存取列存儲或欄存索引時擁有平行計畫。
Supportability
這些系統視圖對資料列存儲而言是新的︰
這些記憶體內的 OLTP 型動態管理檢視 (DMV) 包含資料行存放區的更新:
Limitations
- 至於記憶體中資料表,資料行存放區索引必須包含所有的資料行,而資料行存放區索引不能有篩選的條件。
- 針對記憶體內部數據表,數據行存放區索引的查詢只會以 Interop 模式執行,而不是在原生編譯模式中執行。 支援平行執行。
已知問題
適用於: SQL Server 2022 (16.x) 和舊版,Azure SQL 受控實例2022
- 在壓縮的列存儲區段中,LOB 列(varbinary(max)、varchar(max) 和 nvarchar(max))使用的數據頁無法被
DBCC SHRINKDATABASE和DBCC SHRINKFILE移動。 這個問題在 SQL Server 2025(17.x)中已經解決。
SQL Server 2014 (12.x)
SQL Server 2014 (12.x) 引進了叢集資料行存放區索引,作為主要的儲存體格式。 這允許一般的負載以及更新、刪除和插入作業。
- 資料表可以使用叢集資料行存放區索引作為主要的資料表儲存體。 資料表上不允許其他索引,但是叢集資料行存放區索引是可以更新的,所以您可以執行一般的載入並對個別資料列進行變更。
- 非叢集資料行存放區索引繼續保有 SQL Server 2012 (11.x) 中的相同功能,但現在能以批次模式執行其他運算子。 除非透過重建或使用分區切換,否則仍然無法更新。 非叢集資料行存放區索引僅支援磁碟基礎資料表,並不支援記憶體中資料表。
- 叢集與非叢集資料行存放區索引都有封存壓縮選項,可進一步壓縮資料。 封存選項有利於減少記憶體中和磁碟上的資料大小,但是確實會降低查詢效能。 它非常適合不常存取的資料。
- 叢集資料行存放區索引和非叢集資料行存放區索引的作用十分相似,它們使用相同的單欄式儲存體格式、相同的查詢處理引擎,和相同的動態管理檢視集合。 差別在於主要和次要的索引類型,而且非叢集資料行存放區索引是唯讀的。
- 這些運算子可以在批次模式下執行多執行緒查詢:掃描、篩選、投影、連接、分組和合併所有。
SQL Server 2012 (11.x)
SQL Server 2012 (11.x) 引進了非叢集資料行存放區索引,作為資料列存放區資料表的另一個索引類型,以及資料行存放區資料查詢批次處理方式。
- 資料列儲存表最多可以擁有一個非叢集式資料行存放區索引。
- 資料行存放區索引是唯讀的。 建立資料行存放區索引之後,您無法執行
INSERT、DELETE和UPDATE作業來更新資料表;若要執行這些作業,您必須卸除索引,並更新資料表,然後重建資料行存放區索引。 您可以切換資料分割,在資料表中載入其他資料。 分割區切換的優勢是您可以載入資料,而無需刪除和重建資料行存放區索引。 - 資料行儲存索引總是需要額外的儲存空間,通常比資料列儲存多出約 10%,因為它需要儲存資料的複本。
- 批次處理序提供 2 倍或更高的查詢效能,但僅供平行查詢執行使用。