Quali passaggi dovrebbero essere necessari per ottimizzare una query con scarse prestazioni?

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

  •  09-06-2019
  •  | 
  •  

Domanda

So che si tratta di una domanda ampia, ma ho ereditato diversi artisti con prestazioni scadenti e ho bisogno di ottimizzarli in modo intensivo.Mi chiedevo quali siano i passaggi più comuni necessari per l'ottimizzazione.Allora, quali passi intraprendono alcuni di voi di fronte alla stessa situazione?

Domanda correlata:
Quali tecniche generiche possono essere applicate per ottimizzare le query SQL?

È stato utile?

Soluzione

  1. Guarda il piano di esecuzione nell'analizzatore di query
  2. Scopri quale passaggio costa di più
  3. Ottimizza il passo!
  4. Ritorna al passaggio 1 [grazie a Vinko]

Altri suggerimenti

In SQL Server è possibile esaminare il piano di query in Query Analyser o Management Studio.Questo ti dirà la percentuale approssimativa di tempo trascorso in ogni serie di dichiarazioni.Ti consigliamo di cercare quanto segue:

  • Scansioni di tabelle;questo significa che ti mancano completamente gli indici
  • Scansioni dell'indice;la tua query potrebbe non utilizzare gli indici corretti
  • Lo spessore delle frecce tra ogni passaggio di una query indica quante righe vengono prodotte da quel passaggio, frecce molto spesse indicano che stai elaborando molte righe e possono indicare che alcuni join devono essere ottimizzati.

Alcuni altri consigli generali:

  • Una grande quantità di istruzioni condizionali, ad esempio più istruzioni if-else, può causare la ricostruzione costante del piano di query in SQL Server.Puoi verificarlo utilizzando Profiler.
  • Assicurati che query diverse non si blocchino a vicenda, ad esempio un'istruzione update blocca un'istruzione select.Ciò può essere evitato specificando l'hint (nolock) nelle istruzioni select di SQL Server.
  • Come altri hanno già detto, prova la procedura guidata di ottimizzazione delle prestazioni in Management Studio.

Infine, consiglio vivamente di creare una serie di test di carico (utilizzando Visual Studio 2008 Test Edition), che è possibile utilizzare per simulare il comportamento dell'applicazione quando si gestisce una grande quantità di richieste.Alcuni colli di bottiglia delle prestazioni SQL si manifestano solo in queste circostanze ed essere in grado di riprodurli rende molto più semplice risolverli.

Gli indici possono essere un buon punto di partenza...

Il frutto basso e pendente può essere abbattuto con il server SQL Indice Procedura guidata di ottimizzazione.

Non sono sicuro di altri database, ma per SQL Server consiglio il piano di esecuzione.Mostra molto chiaramente (anche se con molto scorrimento verticale e orizzontale, a meno che tu non abbia un monitor da 400 pollici!) Mostra quali passaggi della tua query stanno risucchiando tempo.

Se hai un passaggio che richiede un incredibile 80%, allora forse potrebbe essere aggiunto un indice, quindi dopo aver modificato l'indice, riesegui il piano di esecuzione per trovare il prossimo passo più grande.

Dopo un paio di modifiche potresti scoprire che in realtà non ci sono passaggi che si distinguono dagli altri, ad es.sono tutti 1-2% ciascuno.In tal caso, potresti dover vedere se esiste un modo per ridurre la quantità di dati inclusi nella query, se quei quattro milioni di ordini di vendita chiusi devono essere inclusi nella query "Ordini di vendita attivi" ?No, quindi escludi tutti quelli con STATUS='C'...o qualcosa di simile.

Un altro miglioramento che vedrai dal piano di esecuzione è la ricerca dei segnalibri, in pratica trova una corrispondenza nell'indice, ma poi SQL Server deve scorrere rapidamente la tabella per trovare il record desiderato.Questa operazione a volte potrebbe richiedere più tempo della semplice scansione della tabella in primo luogo, in tal caso, hai davvero bisogno di quell'indice?

Con gli indici, e in particolare con SQL Server 2005, dovresti guardare alla clausola INCLUDE, che in pratica ti consente di avere una colonna in un indice senza essere realmente nell'indice, quindi se tutti i dati necessari per la tua query sono nel tuo indice o è una colonna inclusa, quindi SQL Server non deve nemmeno guardare la tabella, un grande miglioramento delle prestazioni.

Ci sono un paio di cose che puoi considerare per ottimizzare le prestazioni delle tue query.

  1. Assicurati di avere solo il minimo di dati.Assicurati di selezionare solo le colonne che ti servono.Ridurre al minimo le dimensioni dei campi.

  2. Prendi in considerazione la denormalizzazione del tuo database per ridurre i join

  3. Evitare loop (ad es.recuperare i cursori), attenersi alle operazioni di impostazione.

  4. Implementare la query come procedura memorizzata poiché è precompilata e verrà eseguita più velocemente.

  5. Assicurati di aver impostato gli indici corretti.Se il tuo database viene utilizzato principalmente per la ricerca, considera più indici.

  6. Utilizzare il piano di esecuzione per vedere come viene eseguita l'elaborazione.Ciò che vuoi evitare è una scansione della tabella poiché è costosa.

  7. Assicurati che le statistiche automatiche siano attivate.SQL ne ha bisogno per decidere l'esecuzione ottimale.Vedi l'ottimo post di Mike Gunderloy per maggiori informazioni. Nozioni di base sulla statistica in SQL Server 2005

  8. Assicurati che i tuoi indici non siano frammentati Riduzione della frammentazione dell'indice di SQL Server

  9. Assicurati che le tue tabelle non siano frammentate. Come rilevare la frammentazione delle tabelle in SQL Server 2000 e 2005

Il piano di esecuzione è un ottimo inizio e ti aiuterà a capire quale parte della tua query devi affrontare.

Una volta capito il dove, è il momento di affrontare il come e il perché.Dai un'occhiata al tipo di query che stai tentando di eseguire.Evita i loop a tutti i costi perché sono lenti.Evita i cursori a tutti i costi perché sono lenti.Attenersi alle query basate su set quando possibile.

Esistono modi per fornire suggerimenti SQL sul tipo di join da utilizzare se si utilizzano i join.Fai attenzione qui, però, mentre un suggerimento può accelerare la tua query una volta, potrebbe rallentarla 10 volte la volta successiva a seconda dei dati e dei parametri.

Infine, assicurati che il tuo database sia ben indicizzato.Un buon punto di partenza è qualsiasi campo contenuto in una clausola where che probabilmente dovrebbe contenere un indice.

Guarda gli indici sulle tabelle che compongono la query.Potrebbero essere necessari indici su campi particolari che partecipano alla clausola where.Guarda anche i campi utilizzati nei join nella query (se esistono join).Se gli indici esistono già, guarda il tipo di indice.

In caso contrario (perché ci sono aspetti negativi nell'usare i suggerimenti di blocco) Guarda i suggerimenti di blocco e nomina esplicitamente l'indice da utilizzare nel join.Usare NOLOCKS è più ovvio se ricevi molte transazioni bloccate.

Tuttavia, fai quello che Roman e Andy S hanno menzionato prima.

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