Sdílet prostřednictvím


Optimalizace dotazů s využitím omezení primárního klíče

Omezení primárního klíče, která zachycují relace mezi poli v tabulkách, můžou uživatelům a nástrojům pomoct pochopit relace v datech. Tento článek obsahuje příklady, které ukazují, jak můžete použít primární klíče s možností RELY optimalizovat některé běžné typy dotazů.

Poznámka

Optimalizace dotazů přidružené k RELY příkazu vyžadují, aby se dotazy spouštěly na výpočetních prostředcích s podporou Photon. Podívejte se na co je Photon? Photon běží ve výchozím nastavení ve službě SQL Warehouse a bezserverové výpočetní prostředky pro poznámkové bloky a pracovní postupy. Další informace o Photonu najdete v tématu Co je Photon?

Přidání omezení primárního klíče

V příkazu pro vytvoření tabulky můžete přidat omezení primárního klíče, jako v následujícím příkladu, nebo přidat omezení do tabulky pomocí klauzule ADD CONSTRAINT.

CREATE TABLE customer (
  c_customer_sk int,
  PRIMARY KEY (c_customer_sk)
  ...
  )

V tomto příkladu c_customer_sk je klíč ID zákazníka. Omezení primárního klíče určuje, že každá hodnota ID zákazníka by měla být v tabulce jedinečná. Azure Databricks nevynucuje klíčová omezení. Můžete je ověřit prostřednictvím stávajícího datového kanálu nebo ETL. Další informace o očekáváních při práci na proudových tabulkách a materializovaných zobrazeních najdete v tématu Správa kvality dat s očekáváními datového potrubí. Informace o práci s omezeními v tabulkách Delta najdete v tématu Omezení v Azure Databricks.

Poznámka

Uživatel zodpovídá za kontrolu, jestli je omezení splněné. Spoléhat se na omezení, které není splněno, může vést k nesprávným výsledkům dotazu.

Slouží RELY k povolení optimalizací.

Pokud víte, že omezení primárního klíče je platné, můžete optimalizaci na základě omezení povolit zadáním možnosti RELY. Úplnou syntaxi najdete v ADD CONSTRAINT klauzuli.

Možnost RELY umožňuje službě Azure Databricks zneužít omezení k přepsání dotazů. Následující optimalizace lze provést pouze v případě, že RELY je možnost zadána ADD CONSTRAINT v klauzuli nebo ALTER TABLE příkazu.

Pomocí ALTER TABLE, můžete upravit primární klíč tabulky tak, aby zahrnoval RELY možnost, jak je znázorněno v následujícím příkladu.


ALTER TABLE
  customer DROP PRIMARY KEY;
ALTER TABLE
  customer
ADD
  PRIMARY KEY (c_customer_sk) RELY;

Příklady optimalizace

Následující příklady rozšiřují předchozí příklad, který vytvoří tabulku customer, kde c_customer_sk je ověřený jedinečný identifikátor pojmenovaný jako PRIMARY KEY se zadanou možností RELY.

Příklad 1: Vyloučení nepotřebných agregací

Následující příklad ukazuje dotaz, který použije DISTINCT operaci na primární klíč.

SELECT
  DISTINCT c_customer_sk
FROM
  customer;

Vzhledem k tomu, že c_customer_sk sloupec je ověřeným omezením PRIMARY KEY, jsou všechny hodnoty ve sloupci jedinečné. Pokud je zadaná možnost RELY, Azure Databricks může dotaz optimalizovat tak, že neprovádí operaci DISTINCT.

Příklad 2: Vyloučení nepotřebných spojení

Následující příklad ukazuje dotaz, ve kterém Azure Databricks může eliminovat nepotřebné spojení.

Dotaz spojí tabulku faktů store_sales s tabulkou dimenzí customer. Provede levé vnější spojení, takže výsledek dotazu zahrnuje všechny záznamy z tabulky store_sales a odpovídající záznamy z tabulky customer. Pokud v tabulce customer neexistuje žádný odpovídající záznam, výsledek dotazu zobrazí NULL hodnotu pro sloupec c_customer_sk.

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss
  LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;

Pro pochopení, proč je toto spojení zbytečné, zvažte dotaz. Vyžaduje pouze sloupec ss_quantity z tabulky store_sales. Tabulka customer je spojena na základě svého primárního klíče, takže každý řádek store_sales odpovídá maximálně jednomu řádku v customer. Vzhledem k tomu, že operace je vnější spojení, zachovají se všechny záznamy z tabulky store_sales, takže spojení nezmění žádná data z této tabulky. Agregace SUM je stejná bez ohledu na to, jestli jsou tyto tabulky spojené.

Použití omezení primárního klíče s RELY poskytuje optimalizátoru dotazů informace, které potřebuje k odstranění spojení. Optimalizovaný dotaz vypadá nějak takto:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Další kroky

V tématu Zobrazení diagramu vztahů entit se dozvíte, jak prozkoumat vztahy primárního klíče a cizího klíče v uživatelském rozhraní Průzkumníka katalogu.