Quali sono i metodi per identificare le colonne non necessarie all'interno di un indice di copertura?

StackOverflow https://stackoverflow.com/questions/1545661

Domanda

Quali metodi sono lì per identificare le colonne superflue nel coprire indici:? Le colonne mai cercato contro, e pertanto possono essere estratti in Include, o addirittura eliminare completamente senza influenzare l'applicabilità dell'indice

È stato utile?

Soluzione

Per chiarire le cose
L'idea di un indice di copertura è che include anche le colonne che non può essere cercato da (usato nella clausola WHERE e simili), ma può essere selezionata (parte SELECT elenco colonne).

Non sembra essere un modo semplice per affermare l'esistenza di colonne non utilizzate in un indice di copertura . Posso solo pensare di un faticoso processo di seguito:

  • Per un periodo di tempo rappresentativo, registrare tutte le query in esecuzione sul server (o sul tavolo desiderato)
  • Filtro out (tramite espressioni regolari) non query che coinvolgono la tabella sottostante
  • Per restanti domande, ottenere il piano di query; scartare le query che non comportano l'indice in questione
  • Per le restanti domande, o meglio, per ogni "modello" di query (molte query sono gli stessi, ma per i criteri di ricerca valori), fare l'elenco delle colonne dall'indice che sono o nella clausola select o dove (o in JOIN ...)
  • le colonne l'indice non si trovano in tale elenco sono positivamente a posto.

Ora, ci può essere qualche [colonne per rimuovere] perché il processo di cui sopra non verifica nel quale contesto l'indice di copertura è utilizzata (è possibile che venga usata per risolvere il dove, ma che la tabella sottostante è ancora letta così (per esempio per arrivare alle colonne non nell'indice copertura ...)

L'approccio clinico di cui sopra è poco attraente. Un approccio analitico può essere preferibile :

Trova tutte le query "modelli" che possono essere utilizzati in tutte le applicazioni che utilizzano il server. Per ciascuno di questi modelli, trovare quelli che potrebbero utilizzare l'indice di copertura. Questi sono (di nuovo un paio di buche ...) le query che:

  • il riferimento alla tabella sottostante
  • non cita in alcun modo una colonna dalla tabella sottostante che non è una colonna nell'indice
  • Non utilizzare un criterio di ricerca dalla tabella sottostante che è più selettivo che le colonne dell'indice (a loro stessa fine ...)

O ... senza nemmeno andare alle applicazioni: pensare a tutti i casi d'uso , e se le query che servirebbero questi casi trarrebbero vantaggio di non da tutte le colonne dell'indice. In questo modo implicherebbe che hai una relativamente buona idea della selettività dell'indice, per quanto riguarda le sue prime colonne.

Altri suggerimenti

Se fai audit dei vostri casi d'uso e punti di dati, ovviamente, tutto ciò che non viene utilizzato o catturati nella revisione contabile è un candidato per l'eliminazione. Se il database manca una verifica approfondita tale, è possibile salvare la pena di di finestra temporale di query che hanno colpito il database eseguendo una traccia e salvandolo. È possibile analizzare la traccia e vedere che tipo di query stanno colpendo il database e da lì intuire quali colonne può essere lasciato cadere.

Analisi di tracce è in genere utilizzato per trovare i candidati per mancante indici, ma credo che potrebbe essere utilizzato anche per analizzare le tendenze di utilizzo.

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