Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能
目錄
?
(一)前言
(二)有序與無序聚集列存儲索引
(三)查詢性能
(四)數據加載性能
(五)減少段重疊
(六)在大型表中創建有序 CCI
(六)實戰案例
A. 檢查有序列和序號:
B. 若要更改列序號,請在順序列表中添加或刪除列,或者從 CCI 更改為有序 CCI:
(一)前言
? ? ? ?當用戶查詢專用 SQL 池中的列存儲表時,優化器會檢查每個段中存儲的最小值和最大值。 超出查詢謂詞邊界的段不會從磁盤讀取到內存。 如果要讀取的段的數目及其總大小較小,則查詢性能可以更快。
(二)有序與無序聚集列存儲索引
? ? ? ?默認情況下,對于不是使用索引選項創建的每個表,某個內部組件(索引生成器)將在該表中創建無序的聚集列存儲索引 (CCI)。 每個列中的數據壓縮成單獨的 CCI 行組段。 每個段的值范圍都有元數據,因此,在執行查詢期間,不會從磁盤中讀取超出查詢謂詞邊界的段。 CCI 提供最高級別的數據壓縮,可減少要讀取的段大小,因此查詢可以更快地運行。 但是,由于索引生成器在將數據壓縮成段之前不會將數據排序,因此可能會出現值范圍重疊的段,從而導致查詢從磁盤中讀取更多的段,需要更長的時間才能完成。
? ? ? ?創建有序 CCI 時,專用 SQL 池引擎會先按順序鍵將內存中的現有數據排序,然后,索引生成器會將這些數據壓縮成索引段。 使用有序數據可以減少段重疊的情況,使查詢更有效地消除段,因而可提高性能,因為要從磁盤讀取的段數更少。 如果可以一次性在內存中為所有數據排序,則可以避免段重疊的情況。 由于數據倉庫中的表較大,因此這種情況不經常發生。
? ? ? ?若要檢查列的段范圍,請結合表名稱和列名稱運行以下命令:
SELECT o.name, pnp.index_id, cls.row_count, pnp.data_compression_desc, pnp.pdw_node_id, pnp.distribution_id, cls.segment_id, cls.column_id, cls.min_data_id, cls.max_data_id, cls.max_data_id-cls.min_data_id as difference FROM sys.pdw_nodes_partitions AS pnpJOIN sys.pdw_nodes_tables AS Ntables ON pnp.object_id = NTables.object_id AND pnp.pdw_node_id = NTables.pdw_node_idJOIN sys.pdw_table_mappings AS Tmap ON NTables.name = TMap.physical_name AND substring(TMap.physical_name,40, 10) = pnp.distribution_idJOIN sys.objects AS o ON TMap.object_id = o.object_idJOIN sys.pdw_nodes_column_store_segments AS cls ON pnp.partition_id = cls.partition_id AND pnp.distribution_id = cls.distribution_id JOIN sys.columns as cols ON o.object_id = cols.object_id AND cls.column_id = cols.column_id WHERE o.name = '<Table Name>' and cols.name = '<Column Name>' and TMap.physical_name not like '%HdTable%' ORDER BY o.name, pnp.distribution_id, cls.min_data_id;備注
在有序 CCI 表中,同一批 DML 或數據加載操作生成的新數據將在該批中排序,而表中的所有數據不會經過全局排序。 用戶可以重新生成 (REBUILD) 有序 CCI 來對表中的所有數據進行排序。 在專用 SQL 池中,列存儲索引重新生成是一項脫機操作。 對于已分區的表,每次將對一個分區執行重新生成。 重新生成的分區中的數據是“脫機”的,在對該分區完成重新生成之前,這些數據不可用。
?
(三)查詢性能
? ? ? ?有序 CCI 帶來的查詢性能提升程度取決于查詢模式、數據大小、數據排序的合理性、段的物理結構,以及為查詢執行選擇的 DWU 和資源類。 在設計有序 CCI 表時,用戶應在選擇排序列之前考慮所有這些因素。
具有所有這些模式的查詢在使用有序 CCI 時運行速度往往更快。
在此示例中,表 T1 具有一個已按 Col_C、Col_B 和 Col_A 順序排序的聚集列存儲索引。
CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON T1 ORDER (Col_C, Col_B, Col_A);由于查詢 1 和查詢 2 引用所有有序 CCI 列,因此相比其他查詢,這兩種查詢的性能最適用于有序 CCI。
-- Query #1: SELECT * FROM T1 WHERE Col_C = 'c' AND Col_B = 'b' AND Col_A = 'a';-- Query #2SELECT * FROM T1 WHERE Col_B = 'b' AND Col_C = 'c' AND Col_A = 'a';-- Query #3 SELECT * FROM T1 WHERE Col_B = 'b' AND Col_A = 'a';-- Query #4 SELECT * FROM T1 WHERE Col_A = 'a' AND Col_C = 'c';(四)數據加載性能
? ? ? ?將數據載入有序 CCI 表中的性能類似于將數據載入已分區的表。 由于需要執行數據排序操作,將數據載入有序 CCI 表所需的時間可能比載入無序 CCI 表更長,但之后,查詢可以使用有序 CCI 更快地運行。
以下示例將數據載入采用不同架構的表的性能做了比較。
以下示例對使用 CCI 和有序 CCI 的查詢性能做了比較。
(五)減少段重疊
? ? ? ?重疊段的數目取決于要排序的數據的大小、可用內存,以及創建有序 CCI 期間的最大并行度 (MAXDOP) 設置。 以下選項可以在創建有序 CCI 時減少段重疊情況。
-
在更高的 DWU 上使用 xlargerc 資源類,以便在索引生成器將數據壓縮成段之前,有更多的內存可用于數據排序。 進入索引段后,數據的物理位置不可更改。 段內部或者段之間不會發生數據排序。
-
使用 MAXDOP = 1 創建有序 CCI。 用于創建有序 CCI 的每個線程針對一部分數據運行,并在本地為數據排序。 已由不同線程排序的數據不會經過全局排序。 使用并行線程可以減少創建有序 CCI 所需的時間,但生成的重疊段比使用單個線程時更多。 目前,MAXDOP 選項只可用于通過 CREATE TABLE AS SELECT 命令創建有序 CCI 表。 通過 CREATE INDEX 或 CREATE TABLE 命令創建有序 CCI 時不支持 MAXDOP 選項。 例如,
- 將數據載入表之前,預先按排序鍵將數據排序。
? ? ? ?下面是有序 CCI 表分布示例,該表根據上述建議清除了段重疊情況。 該有序 CCI 表是使用 MAXDOP 1 和 xlargerc,基于 20-GB 的堆表通過 CTAS 在 DWU1000c 數據庫中創建的。 CCI 已按照不包含重復項的 BIGINT 列進行排序。
(六)在大型表中創建有序 CCI
? ? ? ?創建有序 CCI 是一項脫機操作。 對于不包含分區的表,在有序 CCI 創建過程完成之前,用戶無法訪問數據。 對于已分區的表,由于引擎將按分區創建有序的 CCI 分區,因此,在尚未進行有序 CCI 創建操作的情況下,用戶仍可以訪問分區中的數據。 在大型表中創建有序 CCI 的過程中,可以使用此選項來盡量減少停機時間:
提示
對于具有有序 CCI 的專用 SQL 池表,ALTER INDEX REBUILD 將使用 tempdb 重新對數據進行排序。 重新生成操作期間監視 tempdb。 如果需要更多 tempdb 空間,請縱向擴展該池。 完成索引重新生成之后,縮小為原空間大小。
對于具有有序 CCI 的專用 SQL 池表,ALTER INDEX REORGANIZE 不對數據進行重新排序。 若要重新排序數據,請使用 ALTER INDEX REBUILD。
有關有序 CCI 維護的詳細信息,請看下一篇Azure Synapse Analytics 性能優化指南(2)
(六)實戰案例
A. 檢查有序列和序號:
SELECT object_name(c.object_id) table_name, c.name column_name, i.column_store_order_ordinal FROM sys.index_columns i JOIN sys.columns c ON i.object_id = c.object_id AND c.column_id = i.column_id WHERE column_store_order_ordinal <>0;B. 若要更改列序號,請在順序列表中添加或刪除列,或者從 CCI 更改為有序 CCI:
(下列SQL中表名和列名均為我實際案例中的字段,讀者使用時候請替換)
CREATE CLUSTERED COLUMNSTORE INDEX InternetBonus ON dim_zyy_test ORDER ([CustomerID],[Monthkey] ) WITH (DROP_EXISTING = ON);總結
以上是生活随笔為你收集整理的Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html自动适应屏幕分辨率,关于HTML
- 下一篇: GeneXus学习(三)数据库操作【可视