sql - velocizzare - Gli indici possono effettivamente ridurre le prestazioni SELECT?




velocizzare query sql (4)

Possibile duplicato:
Prestazione degradata di una query dopo aver aggiunto l'indice

dopo aver letto alcune informazioni sugli indici di SQL Server e i loro vantaggi in termini di prestazioni in termini di selezioni e svantaggi per gli aggiornamenti / inserti, mi chiedevo se gli indici usati male potessero in realtà danneggiare le prestazioni di select. Quali condizioni dovrebbero essere soddisfatte affinché un indice riduca le prestazioni di una query di selezione pura? Esistono situazioni del genere?

Grazie!

(anche se cerco sempre di includere esempi di codice, non riesco a pensare a nulla che possa supportare questa domanda ...)


La mia ipotesi sarebbe se si creano indici che confondono l'ottimizzatore del piano di query, e che finisce per scegliere un indice inefficiente per la query a portata di mano.


Questo è potenzialmente dipendente dall'implementazione, ma in linea di principio gli indici non dovrebbero rallentare SELECT .

Ovviamente possono rallentare INSERT e UPDATE .


Sì, ma è molto improbabile e non dovrebbe influenzare la tua decisione di utilizzare gli indici.

Talvolta, l'analizzatore di query di SQL Server sceglie un piano di esecuzione non ottimale. Poiché il numero di possibili piani di esecuzione è molto più grande di quanto possa sembrare a prima vista (un semplice join di n tabelle produce già n! Possibili piani di esecuzione), SQL Server deve fare un'ipotesi plausibile. È nella natura di supposizioni che a volte si sbagliano.

È un evento raro, ma l'ho visto accadere un paio di volte negli ultimi anni. In quel caso (e solo in quel caso), sarebbe stato scelto un piano migliore se l'indice non fosse stato lì. Tuttavia , la rimozione dell'indice non è il modo corretto per risolvere questo problema, poiché l'indice di solito esiste per un motivo. Il modo corretto consiste nell'aggiungere un suggerimento a questa query (e solo a questa query), per aiutare l'ottimizzatore a scegliere il piano giusto.


Sì, anche se leggermente - così lievemente che sarebbe giustificato anche rispondere "No".

Se si dispone di un indice che potrebbe essere considerato per una query, ma non è utilizzabile, l'ottimizzatore sprecherà un breve periodo di tempo a riflettere se e come utilizzarlo (in rari casi con indici e viste REALMENTE complicati e più frequentemente quando si suggeriscono le prestazioni dell'indice sono sbagliati, potresti finire per scegliere un piano di query non ottimale).

Alcuni casi potrebbero essere:

  • una tabella senza indici
  • una tabella con un indice male scelto, che viene scartato
  • una tabella in cui esistono DUE indici e, per qualche motivo (ad esempio statistiche obsolete), l'esistenza del secondo indice fa sì che l'ottimizzatore lo scelga, mentre sarebbe stato più comodo utilizzare il primo.

Nei primi due casi il tempo di interrogazione è lo stesso (e comporta una scansione completa), ma nel secondo, devi anche analizzare e scartare l'indice.

Dove un indice ti fa male - dove TUTTI gli indici ti fanno male - è in inserti, cancella e aggiorna. Quindi, qualsiasi indice non utilizzato dalla query di aggiornamento, ma influenzato dallo stesso, richiederà una scrittura all'indice stesso.

Quindi vorrai avere indici, ma il minor numero possibile senza sacrificare le prestazioni SELECT. In realtà, potresti decidere di non utilizzare l'indicizzazione per una query SELECT utilizzata raramente per evitare che l'indice necessario venga costantemente aggiornato da tutte le altre query UPDATE.

Modifica: dopo aver letto la risposta di Heinzi, vorrei anche aggiungere che la maggior parte dei server DB ha strumenti di manutenzione che analizzano le tabelle e gli indici (e talvolta anche i contatori delle prestazioni delle query) e aggiorna correttamente i suggerimenti di cui parlava Heinzi. Quindi è anche importante periodicamente "mantenere" il database per mantenere l'ottimizzatore fornito con informazioni aggiornate su quali indici scegliere.

Aggiornamento (MySQL)

Esiste uno strumento di analisi MySQL molto utile che può effettivamente suggerire miglioramenti all'indicizzazione esistente (rimuovere chiavi non utilizzate, aggiungere chiavi utili): common_schema . Vale davvero la pena dare un'occhiata.





indexing