Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La chiave primaria e i vincoli univoci, che acquisisce relazioni di univocità tra i campi nelle tabelle, possono aiutare gli utenti e gli strumenti a comprendere le relazioni nei dati. Questo articolo contiene esempi che illustrano come usare chiavi primarie o vincoli univoci con l'opzione RELY per ottimizzare alcuni tipi comuni di query.
Nota
Le ottimizzazioni delle query associate al comando richiedono che le query vengano eseguite su un calcolo abilitato per Photon. Vedi Che cos'è Photon?. Photon viene eseguito per impostazione predefinita nei warehouse SQL e nelle risorse di calcolo serverless per notebook e flussi di lavoro. Per altre informazioni su Photon, si veda Che cos'è Photon?.
Aggiungere vincoli di chiave primaria o univoci
È possibile aggiungere una chiave primaria o un vincolo univoco nell'istruzione di creazione della tabella, come nell'esempio seguente o aggiungerne una a una tabella usando la ADD CONSTRAINT clausola .
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
)
In questo esempio è c_customer_sk la chiave ID cliente. Il vincolo di chiave primaria specifica che ogni valore ID cliente deve essere univoco nella tabella. I vincoli univoci seguono lo stesso modello usando UNIQUE invece di PRIMARY KEY.
Azure Databricks non applica vincoli di chiave. Possono essere convalidati tramite la pipeline di dati esistente o ETL. Consultare Gestire la qualità dei dati con le aspettative della pipeline per informazioni sulle aspettative operative relative alle tabelle di streaming e alle viste materializzate. Per informazioni sull'uso dei vincoli nelle tabelle Delta, vedere Vincoli in Azure Databricks.
Nota
È responsabilità dell'utente verificare se un vincolo è soddisfatto. L'uso di un vincolo non soddisfatto può causare risultati di query non corretti.
Usare RELY per abilitare le ottimizzazioni
Quando si sa che una chiave primaria o un vincolo univoco è valida, è possibile abilitare le ottimizzazioni in base al vincolo specificandolo con l'opzione RELY . Consultare la clausola ADD CONSTRAINT per la sintassi completa.
L'opzione RELY consente ad Azure Databricks di sfruttare il vincolo per riscrivere le query. Le ottimizzazioni seguenti possono essere eseguite solo se l'opzione RELY è specificata in una clausola o ADD CONSTRAINT in un'istruzione ALTER TABLE .
Usando ALTER TABLE, è possibile modificare la chiave primaria di una tabella per includere l'opzione RELY , come illustrato nell'esempio seguente.
ALTER TABLE
customer DROP PRIMARY KEY;
ALTER TABLE
customer
ADD
PRIMARY KEY (c_customer_sk) RELY;
Esempi di ottimizzazione
Gli esempi seguenti estendono l'esempio precedente che crea una tabella customer in cui c_customer_sk è un identificatore univoco verificato denominato come PRIMARY KEY con l'opzione RELY specificata. Le stesse ottimizzazioni possono essere applicate a un UNIQUE vincolo con l'opzione RELY .
Esempio 1: Eliminare le aggregazioni non necessarie
Di seguito viene illustrata una query che applica un'operazione DISTINCT a una chiave primaria.
SELECT
DISTINCT c_customer_sk
FROM
customer;
Poiché la colonna c_customer_sk è un vincolo di PRIMARY KEY verificato, tutti i valori nella colonna sono univoci. Quando l'opzione RELY è specificata, Azure Databricks può ottimizzare la query evitando di eseguire l'operazione DISTINCT.
L'utilità di ottimizzazione può anche rimuovere DISTINCT quando la colonna selezionata è coperta da un vincolo valido UNIQUE specificato con RELY.
Esempio 2: Eliminare i join non necessari
L'esempio seguente illustra una query in cui Azure Databricks può eliminare un join non necessario.
La query unisce una tabella dei fatti, store_sales con una tabella delle dimensioni customer. Esegue un left outer join, quindi il risultato della query include tutti i record della tabella store_sales e i record corrispondenti della tabella customer. Se nella tabella customer non è presente alcun record corrispondente, il risultato della query mostra un valore NULL per la colonna c_customer_sk.
SELECT
SUM(ss_quantity)
FROM
store_sales ss
LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;
Per comprendere il motivo per cui questo join non è necessario, considerare l'istruzione di query. Richiede solo la colonna ss_quantity della tabella store_sales. La customer tabella viene unita alla chiave primaria o a un vincolo univoco, quindi ogni riga di store_sales corrisponde al massimo una riga in customer. Poiché l'operazione è un outer join, tutti i record della tabella store_sales vengono mantenuti, pertanto il join non modifica i dati di tale tabella. L'aggregazione SUM è la stessa indipendentemente dal fatto che queste tabelle siano unite o no.
L'uso della chiave primaria o del vincolo univoco con RELY fornisce a Query Optimizer le informazioni necessarie per eliminare il join. La query ottimizzata è simile alla seguente:
SELECT
SUM(ss_quantity)
FROM
store_sales ss
Passaggi successivi
Vedere Visualizzare il diagramma delle relazioni tra entità per informazioni su come esplorare le relazioni tra chiavi primarie e chiavi esterne nell'interfaccia utente di Esplora cataloghi.