Domanda

Puoi spiegare i concetti e la relazione tra gli indici di copertura e le query coperte in SQL Server di Microsoft?

È stato utile?

Soluzione

Un indice di copertura è uno che può soddisfare tutte le colonne richieste in una query senza eseguire un'ulteriore ricerca nell'indice cluster.

Non esiste una query di copertura.

Dai un'occhiata a questo articolo di Simple-Talk: Uso degli indici di copertura per migliorare le prestazioni delle query .

Altri suggerimenti

Se tutte le colonne richieste nell'elenco seleziona della query, sono disponibili nell'indice , il motore di query non ha per cercare nuovamente la tabella che può aumentare significativamente le prestazioni della query. Poiché tutte le colonne richieste sono disponibili con nell'indice, l'indice copre la query. Pertanto, la query viene chiamata query di copertura e l'indice è un indice di copertura.

Un indice cluster può sempre coprire una query, se le colonne nell'elenco di selezione provengono dalla stessa tabella.

I seguenti collegamenti possono essere utili, se non si conoscono i concetti:

Un indice di copertura è un indice non cluster . Entrambi gli indici cluster e non cluster utilizzano la struttura di dati B-Tree per migliorare la ricerca di dati, la differenza è che alle foglie di un indice cluster un intero record (cioè riga) è archiviato fisicamente proprio lì !, ma questo non è il caso per indici non cluster. I seguenti esempi lo illustrano:

Esempio: ho una tabella con tre colonne: ID, Fname e Lname.

 inserisci qui la descrizione dell'immagine

Tuttavia, per un indice non cluster, ci sono due possibilità: o la tabella ha già un indice cluster o no:

 inserisci qui la descrizione dell'immagine

Come mostrano i due diagrammi, tali indici non cluster non forniscono una buona prestazione, poiché non riescono a trovare il valore preferito (ovvero Lname) esclusivamente dall'albero B. Devono invece eseguire un ulteriore passaggio di ricerca (ricerca chiave o RID) per trovare il valore di Lname. E, questo è dove l'indice coperto viene visualizzato sullo schermo. Qui, l'indice non cluster su ID copre il valore di Lname proprio accanto ad esso nelle foglie dell'albero a B e non è necessario per qualsiasi tipo di ricerca.

 inserisci qui la descrizione dell'immagine

Una query coperta è una query in cui tutte le colonne nel set di risultati della query vengono estratte da indici non cluster.

Una query viene trasformata in una query coperta dalla disposizione ragionevole degli indici.

Una query coperta è spesso più performante di una query non coperta in parte perché gli indici non cluster hanno più righe per pagina rispetto agli indici cluster o agli indici heap, quindi è necessario portare in memoria meno pagine per soddisfare la query . Hanno più righe per pagina perché solo una parte della riga della tabella fa parte della riga dell'indice.

Un indice di copertura è un indice utilizzato in una query coperta. Non esiste un indice che, di per sé, sia un indice di copertura. Un indice può essere un indice di copertura rispetto alla query A, ma allo stesso tempo non essere un indice di copertura rispetto alla query B.

Ecco un articolo su devx.com che dice:

  

Creazione di un indice non cluster che contiene tutte le colonne utilizzate in una query SQL, una tecnica chiamata indice che copre

Posso solo supporre che una query coperta sia una query che ha un indice che copre tutte le colonne nel suo recordset restituito. Un avvertimento: l'indice e la query dovrebbero essere creati in modo da consentire al server SQL di dedurre effettivamente dalla query che l'indice sia utile.

Ad esempio, un join di una tabella su se stesso potrebbe non beneficiare di tale indice (a seconda dell'intelligence del pianificatore di esecuzione della query SQL):

PersonID ParentID Name
1        NULL     Abe
2        NULL     Bob
3        1        Carl
4        2        Dave

Supponiamo che ci sia un indice su PersonID, ParentID, Name - questo sarebbe un indice di copertura per una query come:

SELECT PersonID, ParentID, Name FROM MyTable

Ma una query come questa:

SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID

Probabilmente non andrebbe molto bene, anche se tutte le colonne sono nell'indice. Perché? Perché non stai davvero dicendo che vuoi usare il triplo indice di PersonID, ParentID, Name .

Invece, stai creando una condizione basata su due colonne - PersonID e ParentID (che esclude Name ) e poi tu ' chiedendo tutti i record, con le colonne PersonID, Nome . In realtà, a seconda dell'implementazione, l'indice potrebbe aiutare quest'ultima parte. Ma per la prima parte, è meglio avere altri indici.

Una query di copertura è su dove tutti i predicati possono essere abbinati usando gli indici nelle tabelle sottostanti.

Questo è il primo passo per migliorare le prestazioni del sql in esame.

un indice di copertura è quello che fornisce ogni colonna richiesta e in cui il server SQL non è tornato all'indice cluster per trovare alcuna colonna. Ciò si ottiene utilizzando l'indice non cluster e utilizzando l'opzione INCLUDE per coprire le colonne. Le colonne non chiave possono essere incluse solo negli indici non cluster. Le colonne non possono essere definite sia nella colonna chiave che nell'elenco INCLUDE. I nomi delle colonne non possono essere ripetuti nell'elenco INCLUDE. Le colonne non chiave possono essere eliminate da una tabella solo dopo aver prima eliminato l'indice non chiave. Vedi i dettagli qui

Quando ho semplicemente ricordato che un indice cluster è costituito da un elenco non heap ordinato da chiave di TUTTE le colonne nella tabella definita, le luci si sono accese per me. La parola "cluster", quindi, si riferisce al fatto che esiste un "cluster" di tutte le colonne, come un gruppo di pesci in quel "punto caldo". Se non esiste alcun indice che copra la colonna contenente il valore ricercato (il lato destro dell'equazione), il piano di esecuzione utilizza una ricerca dell'indice cluster nella rappresentazione dell'indice cluster della colonna richiesta perché non trova la colonna richiesta in nessun altro " copre " indice. La mancanza causerà un operatore di ricerca dell'indice cluster nel piano di esecuzione proposto, in cui il valore ricercato si trova all'interno di una colonna all'interno dell'elenco ordinato rappresentato dall'indice cluster.

Quindi, una soluzione è quella di creare un indice non cluster che abbia la colonna contenente il valore richiesto all'interno dell'indice. In questo modo, non è necessario fare riferimento all'indice cluster e l'ottimizzatore dovrebbe essere in grado di agganciare tale indice nel piano di esecuzione senza alcun suggerimento. Se, tuttavia, esiste un predicato che nomina la chiave di clustering a colonna singola e un argomento per un valore scalare sulla chiave di clustering, verrà comunque utilizzato l'operatore di ricerca dell'indice cluster, anche se esiste già un indice di copertura su una seconda colonna nella tabella senza un indice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top