Domanda

Sto usando SQL server, e ho cercato da vicino il concetto di consultazione con chiave,

http://blog.sqlauthority.com/2009/10/07/sql-server-query-optimization-remove-bookmark-lookup-remove-rid-lookup-remove-key-lookup/

Quindi, se si dispone di una ricerca della chiave è possibile creare un indice con i 'include' colonne per coprire le colonne non dell'indice si hanno nell'istruzione SELECT.

Per esempio,

SELECT ID, FirstName FROM OneIndex WHERE City = 'Las Vegas'
GO

Questo indice includerà una ricerca della chiave,

CREATE NONCLUSTERED INDEX [IX_OneIndex_City] ON [dbo].[OneIndex]
(
[City] ASC
) ON [PRIMARY]
GO

Ma questo rimuoverà la ricerca della chiave,

CREATE NONCLUSTERED INDEX [IX_OneIndex_Include] ON [dbo].[OneIndex]
(
City
) INCLUDE (FirstName,ID) ON [PRIMARY]
GO

Voglio dire quanto di un impatto avrà questo sulle prestazioni? La ricerca della chiave ha un costo dell'operatore di 0,295,969 mila (99%), ma cosa significa in realtà?

Come fai a sapere che è necessario il secondo indice lì, e fino a che punto essa diviene il caso che si sta tentando di aggiungere troppi indici e non vale la pena?

Mi sembra che alcune query possono includere scansioni di indice, le ricerche fondamentali, e ancora sembrano svolgere molto veloce.

È stato utile?

Soluzione

Immaginate la compagnia telefonica ha una lista di numeri di telefono, compreso chi è il cliente, dove vivono, quale sia il loro numero di fatturazione è, e così via. La chiave primaria potrebbe essere il numero di telefono.

Ti danno le Pagine Bianche. Che è come un indice non cluster, che ha ordinato per nome, tra le colonne, come l'indirizzo.

Se si desidera trovare tutte le Farleys nel libro, e sono interessati a loro indirizzi, quindi le pagine bianche è tutto ciò che serve. Si può cercare rapidamente alle Farleys (trovare le Fs, e così via), e poi ci sono tutte le informazioni necessarie.

Ma se si vuole il loro numero di fatturazione, allora avete bisogno di fare una ricerca. È possibile trovare rapidamente tutti i numeri di telefono del Farleys, ma allora avete bisogno di prendere ciascuno di essi (centinaia) e fare un altro Seek (ricerca) nell'indice principale (cluster), quello che è ordinato dal numero di telefono. Ognuno di questi è più o meno lo stesso costo come il cercare di trovare le Farleys, rendendo i tuoi criteri di ordini di grandezza run peggio.

E c'è una soglia. Ad un certo punto, il database si renderà conto che è più veloce solo per passare attraverso ogni pagina del indice cluster, controllando ogni record per vedere se è di interesse.

Scherzi a parte - sbarazzarsi di ricerche. Le vostre domande potrebbero essere veloce ora, ma probabilmente non in scala.

Altri suggerimenti

Sfondo

caso peggiore , una query contenente una ricerca deve andare storage fisico per le righe che richiedono dati di colonna non coperte dal cluster indice. Nel molto peggiore di casi peggiori, ogni ricerca richiederà un I / O separata, e l'esecuzione dovrà aspettare per la pena che il singolo riga di dati di tornare prima di procedere. Questo scenario di solito ha gravi implicazioni di prestazioni se la ricerca deve elaborare un significativo numero di righe.

Questo è il motivo le ricerche ottenere una cattiva stampa tale. D'altra parte, ritengono che la capacità di fare le ricerche è stato introdotto in SQL Server 2000. In SQL Server 7.0 il processore di query potrebbe utilizzare solo un indice non cluster se contenesse tutti le informazioni necessarie per soddisfare la domanda ; in tutti gli altri casi, doveva accedere ai dati tramite un indice cluster (se presente, oppure una scansione mucchio altrimenti). Se le ricerche erano sempre così molto male, SQL Server avrebbe sicuramente mai li introdotto.

In SQL Server 2000 e quindi, dove abbiamo un indice non cluster che fornisce ordinamento utile e / o (la maggior parte) le colonne richiesto da una query, e dove il numero di ricerche è probabile che sia relativamente piccola, con il cluster indice e l'esecuzione di un numero limitato di ricerche sulla tabella di base è probabile che sia il metodo di accesso più economico disponibile (anche se un indice non cluster completamente copre potrebbe essere più conveniente ancora, ovviamente).

In molti casi, si tratta solo di non è pratico per creare il numero di indici non cluster come sarebbe necessario per evitare la scansione della tabella di base per tutte le query comuni. Uno dei motivi potrebbe essere che le prestazioni INSERT/UPDATE/DELETE/MERGE è più importante che l'interrogazione di velocità (ricordate che le operazioni di modifica dei dati hanno anche per mantenere tutti gli indici non cluster colpite). Un altro motivo potrebbe essere lo spazio; ciascun indice non cluster rappresenta una copia di un sottoinsieme di colonne della tabella di base (o espressioni applicabile) solo filtrate diverso. Ulteriori copie del mezzo di dati più spazio di archiviazione, e più cose che competono per lo spazio nella cache dei dati in-memory di SQL Server.

Altre volte, si può creare solo alcuni indici in più (forse filtrata in SQL Server 2008+) con colonne INCLUDE quanto basta per soddisfare la stragrande maggioranza delle domande di prestazioni critiche, senza compromettere le prestazioni di modifica dei dati troppo, e senza usare troppo spazio su disco aggiuntivo. Bilanciare le considerazioni in competizione è ciò che rende la sintonizzazione indice più arte che scienza.

Costo

Si chiede quale sia il costo del 99% per l'operatore di ricerca davvero mezzi nel piano di query. La componente dei costi di Query Optimizer produce un stimato costo per tale operazione, che è il 99% del totale stimato per la query. Il numero stesso (0,29) non significa molto a tutti; a tutti gli effetti, si dovrebbe considerare come un numero di unità-meno utilizzato internamente dal ottimizzatore quando si confrontano strategie alternative per quella query specifica.

Il costo stimato non tiene conto del vostro hardware, la configurazione, le esigenze applicative, o molto altro. Il modello di costi utilizzato dal ottimizzatore comprende un numero significativo di euristiche e semplificando assunzioni che accadere per produrre ragionevoli piani maggior parte del tempo, per la maggior parte delle query, sulla maggior parte dell'hardware. Questo non vuol dire che non v'è non di correlazione tra gli operatori ad alto costo dei piani e delle prestazioni; piuttosto il legame è spesso molto più debole di quanto comunemente previsto. Con tutti i mezzi verificare le ragioni per gli operatori di piano ad alto costo stimato prima, ma non trattare l'informazione come qualcosa di diverso da una stima molto probabilmente viziata.

Impatto

voglio anche citare un paio di fattori che possono migliorare l'impatto delle ricerche. In primo luogo, ho detto fin dall'inizio che il caso peggiore comporta riga per riga I / O fisico . Questo will ovviamente essere evitato se le pagine di dati (indice cluster o heap) necessari per soddisfare le ricerche sono già in memoria (cache di dati). Quando questo è il caso, la differenza di tempo di esecuzione tra un piano con una ricerca rispetto a un indice di copertura può anche essere misurabile. Anche dove è richiesto fisico di I / O, se il numero di letture è piccolo, è ancora possibile che non si cura. (Come pagine di dati probabile per un tavolo devono essere nella cache di dati dipende da molti fattori, e sarà specifico per l'hardware e le circostanze).

Dove più che un po 'di I / O fisici è necessaria, l'impatto delle ricerche possono ancora essere ridotti di ottimizzazioni presenti nel piano di query. Se SQL Server prevede il numero di ricerche per essere significativa, può scegliere di ordinare le righe esplicitamente immettendo i cicli nidificati iscriviti guidare la ricerca in ordine delle chiavi non cluster. Questo riordino promuove la lettura sequenziale dell'indice non cluster, che può essere molto molto più veloce di I / O casuali sul vostro hardware.

Con o senza una sorta esplicito, i cicli nidificati join guidare la ricerca può avere la WithOrderedPrefetch o gli attributi presenti WithUnorderedPrefetch. In entrambi i casi, i 'guarda avanti' motore di esecuzione di query nel flusso di chiave di indice guida le ricerche e problemi read-ahead legge. L'idea è quella di emissione asincrono di lettura richieste al sistema di I / O per le pagine di dati che saranno necessari più presto, in modo che per il momento la ricerca ha bisogno di una pagina di dati, è già presente in memoria.

In condizioni ideali (bassa frammentazione, buon piano di query, ad alte prestazioni di I / O del sistema) il meccanismo di read-ahead potrebbe essere abbastanza veloce per evitare che anche i grandi piani di query parallele da sempre in attesa di I / O al completo. Ciò è particolarmente vero in Enterprise Edition, che può emettere molto grandi richieste singolo I / O (fino a 2 MB per ogni richiesta se la memoria non serve). D'altra parte, in meno di ideale (più normale!) Le condizioni, la query può soffrire orribilmente come attende il lunghe code di I / O, o non riesce a guidare il sistema O abbastanza I / hard. La peggiore performance caso di consultazione con chiave può essere molto scarsa.

Sommario

In sintesi, si in generale vuole evitare le ricerche dove ha senso farlo . Per le piccole query (che stanno per rimanere piccole) si può decidere che il sovraccarico di indici aggiuntivi (spazio e manutenzione) non è giustificato, dato il giusto peso alle più ampie esigenze del sistema e dei suoi utenti.

In definitiva questo è tutto parte dell'arte e scienza che è lo sviluppo e la gestione di database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top