Lekérdezésoptimalizálás elsődleges kulcs és egyedi korlátozások használatával

Az elsődleges kulcs és az egyedi megkötések, amelyek a táblák mezői közötti egyediségi kapcsolatokat rögzítik, segíthetnek a felhasználóknak és az eszközöknek megérteni az adatokban lévő kapcsolatokat. Ez a cikk példákat tartalmaz, amelyek bemutatják, hogyan használhat elsődleges kulcsokat vagy egyedi korlátozásokat a RELY gyakori lekérdezéstípusok optimalizálásának lehetőségével.

Jegyzet

A parancshoz társított lekérdezésoptimalizálások megkövetelik, hogy a RELY lekérdezések Photon-kompatibilis számításon fussanak. Lásd Mi az a Photon?. A photon alapértelmezés szerint fut az SQL-raktárakon és a jegyzetfüzetek és munkafolyamatok kiszolgáló nélküli számításán. A Photonről további információt a Mi a Photon? című témakörben talál.

Elsődleges kulcs vagy egyedi korlátozások hozzáadása

A táblalétrehozás utasításában az alábbi példához hasonlóan felvehet egy elsődleges kulcsot vagy egyedi korlátozást, vagy hozzáadhat egyet egy táblához a ADD CONSTRAINT záradék használatával.

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

Ebben a példában c_customer_sk az ügyfél-azonosító kulcs látható. Az elsődleges kulcsra vonatkozó korlátozás azt határozza meg, hogy minden ügyfél-azonosító értéknek egyedinek kell lennie a táblában. Az egyedi megszorítások ugyanazt a mintát követik, de PRIMARY KEY helyett UNIQUE használatával.

Az Azure Databricks nem kényszeríti ki a kulcskorlátozásokat. Ezek a meglévő adatfolyamon vagy ETL-en keresztül érvényesíthetők. Tekintse meg a 'Az adatminőség kezelése a folyamatokkal szembeni elvárásokkal' című részt a streamelő táblák és a materializált nézetek várható működésének megismeréséhez. Tekintse meg az Azure Databricks korlátozásait , hogy megismerje a Delta-táblákra vonatkozó korlátozásokat.

Jegyzet

A felhasználó felelőssége annak ellenőrzése, hogy a korlátozás teljesül-e. Ha olyan kényszerre támaszkodik, amely nem teljesül, helytelen lekérdezési eredményekhez vezethet.

Használja a RELY az optimalizálások engedélyezéséhez

Ha tudja, hogy az elsődleges kulcs vagy az egyedi korlátozás érvényes, a kényszer alapján engedélyezheti az optimalizálásokat a RELY beállítás megadásával. A teljes szintaxist lásd ADD CONSTRAINT záradék.

A RELY lehetőség lehetővé teszi, hogy az Azure Databricks kihasználja a lekérdezések újraírására vonatkozó kényszert. A következő optimalizálások csak akkor hajthatóak végre, ha a RELY beállítás egy ADD CONSTRAINT záradékban vagy ALTER TABLE utasításban van megadva.

A ALTER TABLE használatával módosíthatja egy tábla elsődleges kulcsát, hogy belefoglalja a RELY beállítást, ahogy az az alábbi példában is látható.


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

Optimalizálási példák

Az alábbi példák kiterjesztik az előző példát, amely létrehoz egy customer táblát, ahol a c_customer_sk egy ellenőrzött egyedi azonosító, amelyet PRIMARY KEY néven neveznek el a megadott RELY beállítással. Ugyanezek az optimalizálások alkalmazhatók egy UNIQUE korlátozásra a RELY beállítással.

1. példa: Szükségtelen összesítések kiküszöbölése

Az alábbiakban egy lekérdezés látható, amely egy DISTINCT műveletet alkalmaz egy elsődleges kulcsra.

SELECT
  DISTINCT c_customer_sk
FROM
  customer;

Mivel a c_customer_sk oszlop ellenőrzött PRIMARY KEY kényszer, az oszlop összes értéke egyedi. A RELY beállítás megadásával az Azure Databricks úgy optimalizálhatja a lekérdezést, hogy nem hajtja végre a DISTINCT műveletet.

Az optimalizáló a(z) DISTINCT elemet is eltávolíthatja, ha a kijelölt oszlopot egy RELY használatával megadott érvényes UNIQUE korlátozás fedi le.

2. példa: Szükségtelen illesztések kiküszöbölése

Az alábbi példa egy olyan lekérdezést mutat be, amelyben az Azure Databricks kiküszöbölheti a szükségtelen illesztéseket.

A lekérdezés egy ténytáblát illeszt össze, store_sales dimenziótáblával, customer. Bal oldali külső illesztést hajt végre, így a lekérdezés eredménye tartalmazza a store_sales táblából származó összes rekordot, valamint a customer tábla egyező rekordjait. Ha a customer táblában nincs egyező rekord, a lekérdezés eredménye a NULL oszlop c_customer_sk értékét jeleníti meg.

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

Annak megértéséhez, hogy miért szükségtelen ez az illesztés, fontolja meg a lekérdezési utasítást. Csak a ss_quantity táblából származó store_sales oszlopra van szükség. A customer tábla az elsődleges kulcsa vagy egy egyedi megszorítás alapján van összekapcsolva, így a store_sales minden sora legfeljebb egy customer-beli sornak felel meg. Mivel a művelet külső illesztés, a store_sales tábla összes rekordja megmarad, így az illesztés nem módosít adatokat a táblából. A SUM aggregáció ugyanaz, függetlenül attól, hogy ezek a táblák csatlakoznak-e.

Az elsődleges kulcs vagy az egyedi korlátozás RELY használatával a lekérdezésoptimalizáló megadja az illesztés megszüntetéséhez szükséges információkat. Az optimalizált lekérdezés a következőképpen néz ki:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Következő lépések

Tekintse meg Az entitáskapcsolat diagram című témakört, amelyből megtudhatja, hogyan vizsgálhatja meg az elsődleges kulcs- és idegenkulcs-kapcsolatokat a Katalóguskezelő felhasználói felületén.