Frågeoptimering med primärnyckelbegränsningar

Primära nyckelbegränsningar, som samlar in relationer mellan fält i tabeller, kan hjälpa användare och verktyg att förstå relationer i dina data. Den här artikeln innehåller exempel som visar hur du kan använda primära nycklar med RELY alternativet för att optimera vissa vanliga typer av frågor.

Not

Frågeoptimeringar som är associerade med RELY kommandot kräver att frågor körs på Photon-aktiverad beräkning. Se Vad är Photon?. Foton körs som standard på SQL-lager och serverlös beräkning för notebook-filer och arbetsflöden. Mer information om Foton finns i Vad är Foton?.

Lägga till begränsningar för primärnyckel

Du kan lägga till en primärnyckelbegränsning i skapandesatsen för tabellen, som i följande exempel, eller lägga till en begränsning i en tabell med hjälp av ADD CONSTRAINT -satsen.

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

I det här exemplet c_customer_sk är kund-ID-nyckeln. Den primära nyckelbegränsningen anger att varje kund-ID-värde ska vara unikt i tabellen. Azure Databricks tillämpar inte viktiga begränsningar. De kan verifieras via din befintliga datapipeline eller ETL. Se Hantera datakvalitet med pipelineförväntningar för att lära dig mer om arbetsförväntningar på strömmande tabeller och materialiserade vyer. Mer information om hur du arbetar med begränsningar i Delta-tabeller finns i Begränsningar för Azure Databricks .

Not

Det är användarens ansvar att kontrollera om en begränsning är uppfylld. Om du förlitar dig på en begränsning som inte är uppfylld kan det leda till felaktiga frågeresultat.

Använd RELY för att aktivera optimeringar

När du vet att en primärnyckelbegränsning är giltig kan du aktivera optimeringar baserat på begränsningen genom att ange den med RELY alternativet . Se ADD CONSTRAINT-satsen för den fullständiga syntaxen.

Med RELY alternativet kan Azure Databricks utnyttja begränsningen för att skriva om frågor. Följande optimeringar kan bara utföras om RELY alternativet anges i en ADD CONSTRAINT sats eller ALTER TABLE instruktion.

Med ALTER TABLE kan du ändra en tabells primärnyckel så att den inkluderar RELY-alternativet, som du ser i följande exempel.


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

Optimeringsexempel

I följande exempel utökas det tidigare exemplet som skapar en customer tabell där c_customer_sk är en verifierad unik identifierare med namnet som en PRIMARY KEY med det RELY angivna alternativet.

Exempel 1: Eliminera onödiga aggregeringar

Följande visar en fråga som tillämpar en DISTINCT åtgärd på en primärnyckel.

SELECT
  DISTINCT c_customer_sk
FROM
  customer;

c_customer_sk Eftersom kolumnen är en verifierad PRIMARY KEY begränsning är alla värden i kolumnen unika. Med alternativet RELY har angetts kan Azure Databricks optimera frågan genom att inte utföra åtgärden DISTINCT .

Exempel 2: Eliminera onödiga kopplingar

I följande exempel visas en fråga där Azure Databricks kan eliminera en onödig koppling.

Frågan kopplar ihop en faktatabell store_sales med en dimensionstabell, customer. Den utför en vänster yttre koppling, så frågeresultatet innehåller alla poster från store_sales tabellen och matchade poster från customer tabellen. Om det inte finns någon matchande post i customer tabellen visar frågeresultatet ett NULL värde för c_customer_sk kolumnen.

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

Tänk på frågeuttryck för att förstå varför den här kopplingen inte behövs. Det kräver bara ss_quantity kolumnen från store_sales tabellen. Tabellen customer är ansluten till dess primära nyckel, så varje rad store_sales matchar högst en rad i customer. Eftersom åtgärden är en yttre koppling bevaras alla poster från store_sales tabellen, så kopplingen ändrar inga data från den tabellen. Aggregeringen SUM är densamma oavsett om dessa tabeller är anslutna eller inte.

Genom att använda den primära nyckelbegränsningen med RELY får frågeoptimeraren den information som krävs för att eliminera kopplingen. Den optimerade frågan ser mer ut så här:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Nästa steg

Se Visa ett entitetsrelationsdiagram för att lära dig hur du utforskar primärnyckel- och sekundärnyckelrelationer i katalogutforskarens användargränssnitt.