主键和唯一约束(捕获表中字段之间的唯一性关系)可以帮助用户和工具了解数据中的关系。 本文包含的示例演示如何使用主键或唯一约束 RELY 来优化某些常见类型的查询。
备注
与 RELY 命令关联的查询优化要求查询在已启用 Photon 的计算上运行。 请参阅什么是 Photon?。 Photon 默认在 SQL 仓库上运行,并针对笔记本和工作流进行无服务器计算。 若要详细了解 Photon,请参阅什么是 Photon?。
添加主键或唯一约束
可以在表创建语句中添加主键或唯一约束,如以下示例所示,或使用子句向表 ADD CONSTRAINT 添加一个。
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
)
在此示例中,c_customer_sk 是客户 ID 密钥。 主键约束指定每个客户 ID 值在表中应是唯一的。 唯一约束遵循相同的模式,只是使用 UNIQUE 而不是 PRIMARY KEY。
Azure Databricks 不会强制实施主键约束。 可以通过现有数据管道或 ETL 验证它们。 请参阅通过管道预期管理数据质量,了解流式处理表和具体化视图的工作预期。 请参阅 Azure Databricks 上的约束 ,了解如何处理 Delta 表的约束。
备注
用户负责确保是否满足约束。 依赖于未被满足的约束可能会导致查询结果不正确。
使用 RELY 启用优化
当您确定主键或唯一约束有效时,可以通过使用 RELY 选项指定该约束来启用基于该约束的优化。 有关完整语法,请参阅 ADD CONSTRAINT 子句 。
RELY 选项允许 Azure Databricks 利用约束重写查询。 只有在 RELY 子句或 ADD CONSTRAINT 语句中指定了 ALTER TABLE 选项时,才能执行以下优化。
使用 ALTER TABLE,可以修改表的主键来包含 RELY 选项,如以下示例所示。
ALTER TABLE
customer DROP PRIMARY KEY;
ALTER TABLE
customer
ADD
PRIMARY KEY (c_customer_sk) RELY;
优化示例
以下示例扩展了上一个创建customer表的示例,其中c_customer_sk是一个经过验证的唯一标识符,命名为PRIMARY KEY,并指定了RELY选项。 同样的优化也适用于带有 UNIQUE 选项的 RELY 约束。
示例 1:消除不必要的聚合
下面显示了将 DISTINCT 操作应用于主键的查询。
SELECT
DISTINCT c_customer_sk
FROM
customer;
由于 c_customer_sk 列是已验证 PRIMARY KEY 约束,因此该列中的所有值都是唯一的。 指定 RELY 选项后,Azure Databricks 可以通过不执行 DISTINCT 操作来优化查询。
当选定列被由DISTINCT指定的有效UNIQUE约束覆盖时,优化器还可以删除RELY。
示例 2:消除不必要的联接
以下示例演示了一个查询,其中 Azure Databricks 可以消除不必要的联接。
查询将事实表 store_sales 与维度表 customer 连接。 它执行左外部联接,因此查询结果包括 store_sales 表中的所有记录,以及 customer 表中匹配的记录。 如果 customer 表中没有匹配的记录,查询结果将显示 NULL 列的 c_customer_sk 值。
SELECT
SUM(ss_quantity)
FROM
store_sales ss
LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;
若要了解为什么不需要此联接,请考虑查询语句。 它只需要 ss_quantity 表中的 store_sales 列。
customer 表基于其主键或唯一约束进行联接,因此 store_sales 中的每一行最多只会匹配 customer 中的一行。 由于操作是外部联接,因此将保留 store_sales 表中的所有记录,因此该联接不会更改该表中的任何数据。 无论这些表是否联接在一起,SUM 聚合都是相同的。
使用主键或唯一约束 RELY 为查询优化器提供消除联接所需的信息。 优化查询如下所示:
SELECT
SUM(ss_quantity)
FROM
store_sales ss
后续步骤
请参阅 “查看实体关系图 ”,了解如何在目录资源管理器 UI 中浏览主键和外键关系。