目录

(一)前言

(二)有序与无序聚集列存储索引

(三)查询性能

(四)数据加载性能

(五)减少段重叠

(六)在大型表中创建有序 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 时运行速度往往更快。

  1. 查询具有相等性、不相等性或范围谓词
  2. 谓词列和有序 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 选项。 例如,

CREATE TABLE Table1 WITH (DISTRIBUTION = HASH(c1), CLUSTERED COLUMNSTORE INDEX ORDER(c1) )
AS SELECT * FROM ExampleTable
OPTION (MAXDOP 1);
  • 将数据载入表之前,预先按排序键将数据排序。

下面是有序 CCI 表分布示例,该表根据上述建议清除了段重叠情况。 该有序 CCI 表是使用 MAXDOP 1 和 xlargerc,基于 20-GB 的堆表通过 CTAS 在 DWU1000c 数据库中创建的。 CCI 已按照不包含重复项的 BIGINT 列进行排序。

(六)在大型表中创建有序 CCI

创建有序 CCI 是一项脱机操作。 对于不包含分区的表,在有序 CCI 创建过程完成之前,用户无法访问数据。 对于已分区的表,由于引擎将按分区创建有序的 CCI 分区,因此,在尚未进行有序 CCI 创建操作的情况下,用户仍可以访问分区中的数据。 在大型表中创建有序 CCI 的过程中,可以使用此选项来尽量减少停机时间:

  1. 在目标大型表(名为 Table_A)中创建分区。
  2. 使用与表 A 相同的表架构和分区架构创建空的有序 CCI 表(名为 Table_B)。
  3. 将一个分区从表 A 切换到表 B。
  4. 针对表 B 运行 ALTER INDEX <Ordered_CCI_Index> ON <Table_B> REBUILD PARTITION = <Partition_ID>,以重新生成换入的分区。
  5. 针对 Table_A 中的每个分区重复步骤 3 和 4。
  6. 将所有分区从 Table_A 切换到 Table_B 并重新生成这些分区后,删除 Table_A,并将 Table_B 重命名为 Table_A。

提示

对于具有有序 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)——使用有序聚集列存储索引优化性能相关推荐

  1. Azure Synapse Analytics(Azure SQL DW)中建表语句的注意事项

    目录 (一)前言 (二)建表语法 (三)参数说明 1. 列选项 2. 表结构选项 3. 表分发选项 4. 表分区选项 (四)实例 1. 列的示例 (1) 指定一个列排序规则 (2) 指定列的 DEFA ...

  2. SQL Server 2014聚集列存储索引

    转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...

  3. Azure Synapse Analytics(Azure SQL DW) 性能优化指南(2)——使用具体化视图优化性能(上)

    目录 (一)前言 (二)具体化视图与标准视图 1. 两者的定义上区别 2. 具体化视图创建方式 (1)语法 (2)参数 (3)注解 (4)示例 (三)使用具体化视图的优点 (四)常见方案 1. 需要提 ...

  4. Azure Synapse Analytics (Azure SQL DW)性能优化指南(4)——使用结果集缓存优化性能

    目录 (一)前言 (二)关键命令 1. 对用户数据库启用/禁用结果集缓存 (1)检查数据库的统计信息设置 (2)为数据库启用查询存储 (3)为数据库启用结果集缓存 (4)检查数据库的结果集缓存设置 ( ...

  5. 浅谈用KUSTO查询语言(KQL)在Azure Synapse Analytics(Azure SQL DW)审计某DB账号的操作记录

    目录 (一)前言 (二)实际案列 1. 背景说明: 2. 操作步骤 (1)打开Portal (2)搜索"监视器" (3)点击左侧选项卡中的"日志" (4)在新的 ...

  6. Azure Synapse Analytics简介第1部分:什么是Azure Synapse Analytics?

    目录 数据摄取 Azure Data Lake Storage Gen2 数据探索.训练和服务 数据查询服务 Azure Synapse Studio Azure Synapse Notebooks ...

  7. SQL Server 2016新特性:列存储索引新特性

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  8. 行存储索引改换成列存储索引_索引策略–第2部分–内存优化表和列存储索引

    行存储索引改换成列存储索引 In the first part we started discussion about choosing the right table structure and d ...

  9. SQL Server中的列存储索引

    先决条件 (Prerequisite ) 通过理论和实践措施可以更好地解释与SQL Server 2012列存储索引有关的讨论. 因此,对于实际测量部分–我将使用AdventureWorksDW201 ...

最新文章

  1. python基础语言与应用第五章_《Python基础教程》 读书笔记 第五章(下)循环语句...
  2. 【2021年度训练联盟热身训练赛第二场】g2g c u l8r(python)
  3. Python入门 学习笔记
  4. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  5. java调用url505_JAVA中三种URL连接方法
  6. Windows 10+Ubuntu 16.04在MBR分区上安装双系统之后没有Windows 10的启动菜单解决方法...
  7. pandas 机器学习_机器学习的PANDAS
  8. java中钩子方法 addShutdownHook 学习使用
  9. Java 学习之反射机制“解刨”分解类,并获取内容!
  10. Python Jquery学习
  11. BJUI-textarea标签内容高度自适应问题
  12. 告别晦涩难懂的物理,《张朝阳的物理课》了解一下
  13. html5 retina 1像素,7种方法解决移动端Retina屏幕1px边框问题
  14. struts2 数据校验
  15. MSD3393/MSD3463 屏参及REG对照表
  16. 使用karma + mocha + sinon 测试 Ajax 请求
  17. linux重新初始化网络命令,如何在Ubuntu 18.04 Bionic Beaver Linux上重新启动网络
  18. C++ GUI Programming with Qt4 Second Edition 之 前言
  19. Mock工具之Moco使用教程
  20. 《软件测试》读书笔记

热门文章

  1. 再谈深度学习文本的表示
  2. 冀州中学高考2021成绩查询,冀州中学2019高考喜报成绩、本一上线人数情况(
  3. 百度地图 Api v3.0 自定义信息窗体样式
  4. 如何判断牛市是否来了,看这4种指标就够了
  5. 看漫画学python下载_漫画批量下载
  6. 【福尔摩斯的约会】-PAT
  7. 很简单能看懂阿里数据中台分析
  8. copilot 让AI帮你编程(人工智能自动完成)
  9. jenkins学习4-进docker容器安装python3环境
  10. 鹏孚隆冲刺创业板上市:计划募资约7亿元,部分收入来自海外