Optimalizace dotazů pomocí primárního klíče a jedinečných omezení

Primární klíč a jedinečná omezení, která zachycují relace jedinečnosti mezi poli v tabulkách, můžou uživatelům a nástrojům pomoct porozumět relacím v datech. Tento článek obsahuje příklady, které ukazují, jak můžete použít primární klíče nebo jedinečná omezení s RELY možností 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í na SQL skladech dat a bezserverových výpočtech pro poznámkové bloky a pracovní postupy. Další informace o Photonu najdete v tématu Co je Photon?

Přidání primárního klíče nebo jedinečných omezení

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

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á. Jedinečná omezení se řídí stejným vzorem, přičemž se místo PRIMARY KEY používá UNIQUE.

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.

Použijte RELY k povolení optimalizací.

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

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

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. Stejné optimalizace se můžou vztahovat na UNIQUE omezení s 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.

Optimalizátor může také odebrat DISTINCT , pokud je vybraný sloupec pokryt platným UNIQUE omezením zadaným parametrem RELY.

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 pomocí svého primárního klíče nebo omezení UNIQUE, takže každý řádek z store_sales odpovídá nejvýše 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í primárního klíče nebo jedinečného omezení poskytuje RELY 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.