在Azure Synapse Analytics(专用 SQL 池,Azure SQL DW)中对表进行分区

本文详细介绍了在Azure Synapse Analytics的专用SQL池中如何利用表分区来加速数据加载和查询,通过案例展示了如何创建分区表、优化数据分布以及性能对比。

目录

(一)前言

(二)什么是表分区?

1. 表分区定义

2. 对加载的好处     

3. 对查询的好处

(三)分区大小

(四)Azure SQL DW中的分区语法

(五)实战案例

1. 表中现有数据

2. 重构建表语句

3. 保留原表并与新建表后的SQL统计作耗时对比

(1)未优化重新建表前

(2)优化后


(一)前言

       SQL Server、Azure SQL 数据库和Azure SQL 托管实例支持表和索引分区。 已分区表和索引的数据分为可以分布在数据库中的多个文件组或存储在单个文件组中的单位。 当文件组中存在多个文件时,数据使用 比例填充算法跨文件分布。 数据是按水平方式分区的,因此多组行映射到单个的分区。 单个索引或表的所有分区都必须位于同一个数据库中。 对数据进行查询或更新时,表或索引将被视为单个逻辑实体。本文重点探讨在专用SQL池中新建分区表。

       表分区在 Azure Synapse Analytics 的专用SQL池中也可用,语法存在一些差异。

重要

默认情况下,数据库引擎最多支持 15,000 个分区。 在早于 SQL Server 2012 (11.x) 的版本中,默认情况下,分区数限制为 1000 个。

(二)什么是表分区?

1. 表分区定义

       表分区可将数据分成更小的数据组。 大多数情况下,表分区都是根据日期列进行创建。 所有专用 SQL 池表类型(包括聚集列存储、聚集索引和堆)都支持分区。 所有分布类型(包括哈希分布或轮循机制分布)也都支持分区。

       分区可能有利于数据维护和查询性能。 分区是对二者都有利还是只对其中之一有利取决于数据加载方式,以及是否可以将同一个列用于两种目的,因为只能根据一个列来进行分区。

2. 对加载的好处
     

       在专用 SQL 池中进行分区的主要好处是通过分区删除、切换和合并来提高数据加载效率和性能。 大多数情况下,数据是根据日期列来分区的,而日期列与数据加载到 SQL 池中的顺序密切相关。 使用分区来维护数据的最大好处之一是可以避免事务日志记录。 虽然直接插入、更新或删除数据可能是最直接的方法,但如果在加载过程中使用分区,则只需付出一点点思考和努力就可以大大改进性能。

       可以使用分区切换来快速删除或替换表的一部分。 例如,销售事实表可能仅包含过去 36 个月的数据。 在每个月月底,便从表删除最旧月份的销售数据。 删除该数据时,可以使用 delete 语句删除最旧月份的数据。

       但是,使用 delete 语句逐行删除大量数据可能需要极长的时间,同时还会有执行大型事务的风险,这些大型事务在出现错误时进行回退的时间会很长。 更理想的方式是删除最旧的数据分区。 如果在某种情况下删除各个行可能需要数小时,则删除整个分区可能只需数秒钟。

3. 对查询的好处

       分区还可用来提高查询性能。 对分区数据应用筛选器的查询可以将扫描限制在合格的分区上。 此筛选方法可以避免全表扫描且仅扫描数据的一个较小子集。 引入聚集列存储索引以后,谓词消除的性能好处不再那么明显,但在某些情况下,可能会对查询有好处。

       例如,如果使用销售日期字段将销售事实表分区成 36 个月,以销售日期进行筛选的查询便可以跳过对不符合筛选条件的分区的搜索。

(三)分区大小

       虽然在某些情况下可以使用分区来改进性能,但如果在创建表时使用过多分区,则在某些情况下可能会降低性能。 对于聚集列存储表,尤其要考虑到这一点。

       若要使数据分区有益于性能,务必了解使用数据分区的时机,以及要创建的分区的数目。 对于多少分区属于分区过多并没有简单的硬性规定,具体取决于数据,以及要同时加载多少分区。 一个成功的分区方案通常只有数十到数百的分区,没有数千个。

       在“聚集列存储”表上创建分区时,务请考虑每个分区可容纳的行数 。 对于聚集列存储表来说,若要进行最合适的压缩并获得最佳性能,则每个分布和分区至少需要 1 百万行。 在创建分区之前,专用 SQL 池已将每个表细分到 60 个分发中。

        向表添加的任何分区都是基于在后台创建的分布。 根据此示例,如果销售事实数据表包含 36 个按月进行的分区,并假设专用 SQL 池有 60 个分布区,则销售事实数据表每个月应包含 6000 万行,或者在填充所有月份后包含 21 亿行。 如果表包含的行数少于每个分区行数的最小建议值,可考虑使用较少的分区,以增加每个分区的行数。

参考资源链接:[Azure DP-203考试指南:最新题目与解答解析](https://wenku.youkuaiyun.com/doc/640npg9mx5?utm_source=wenku_answer2doc_content) 要在Azure Synapse Analytics专用SQL中实现Type 2 SCD(类型2缓慢变化维度),你需要设计维度来记录数据的历史变化。首先,确保每个维度成员都有一个唯一的代理键,这通常是一个自增的整数,用于替代可能重复的业务键。接着,添加StartDate和EndDate两列来示每个维度成员有效的时间范围。此外,一个可选的IsCurrent标志列可以帮助快速识别当前有效的维度成员。 创建维度SQL语句示例如下: ```sql CREATE TABLE DimCustomer ( CustomerKey int NOT NULL IDENTITY(1,1) PRIMARY KEY, CustomerBusinessKey int NOT NULL, CustomerName varchar(100), StartDate date NOT NULL, EndDate date NULL, IsCurrent bit NOT NULL ); ``` 在这个结构中,`CustomerKey` 是代理键,`CustomerBusinessKey` 是业务键,`StartDate` 和 `EndDate` 定义了维度成员的有效时间段,而 `IsCurrent` 标记当前有效的记录。当新的或变更的数据需要被加载到维度时,可以通过触发器或ETL过程来更新这些列。具体地,如果维度中尚不存在新业务键的记录,则插入新记录并设置 `StartDate` 为当前日期,`EndDate` 为最大值,`IsCurrent` 标记为1。如果记录已存在,则更新 `EndDate` 为当前日期的前一天,并为新的业务键插入新的记录,同时更新 `StartDate` 和 `EndDate`。 通过这种方式,你可以维护一个历史变更记录,实现维度数据的完整性和时间维度的可追溯性。这种设计也符合Azure Synapse Analytics数据仓库的最佳实践,有助于支持复杂的数据分析需求。如果你准备参加DP-203认证考试,这份《Azure DP-203考试指南:最新题目与解答解析》将是你的得力助手,它不仅涵盖了与Type 2 SCD相关的实践题目,还提供了详细解析,帮助你掌握必要的知识点和技能。 参考资源链接:[Azure DP-203考试指南:最新题目与解答解析](https://wenku.youkuaiyun.com/doc/640npg9mx5?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值