主鍵條件約束可擷取數據表中欄位之間的關聯性,可協助使用者和工具了解數據中的關聯性。 本文包含範例,示範如何使用主鍵搭配 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 是客戶標識符密鑰。 主鍵條件約束會指定數據表中的每個客戶標識碼都應該是唯一的。 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指定選項。
範例 1:消除不必要的匯總
下列顯示將作業套用 DISTINCT 至主鍵的查詢。
SELECT
DISTINCT c_customer_sk
FROM
customer;
因為數據 c_customer_sk 行是已 PRIMARY KEY 驗證的條件約束,因此數據行中的所有值都是唯一的。 指定了RELY選項後,Azure Databricks 可以透過不執行DISTINCT操作來優化查詢。
範例 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中探索主鍵和外鍵關聯性。