Prima Run
la query
da Sql Server Management Studio
e guarda il piano di query per vedere dove si trova il collo di bottiglia. In qualsiasi punto in cui vedi una "scansione tabella" o una "scansione indice", devi esaminare tutti i dati per trovare ciò che sta cercando. Se crei indici appropriati che possono essere utilizzati per queste operazioni, le prestazioni dovrebbero aumentare.
Di seguito sono elencati alcuni suggerimenti per migliorare le prestazioni della query sql..
Evita più join in una singola query
Cerca di evitare di scrivere una query SQL utilizzando più join che includono join esterni, applicazione incrociata, applicazione esterna e altre sottoquery complesse. Riduce le scelte di Optimizer per decidere l'ordine di unione e il tipo di unione. A volte, Optimizer è costretto a utilizzare i join di loop nidificati, indipendentemente dalle conseguenze sulle prestazioni per le query con applicazioni incrociate o sottoquery eccessivamente complesse.
Elimina i cursori dalla query Prova a rimuovere i cursori dalla query e utilizza la query basata su insiemi; la query basata su set è più efficiente di quella basata sul cursore. Se è necessario utilizzare il cursore, evitare i cursori dinamici poiché tende a limitare la scelta dei piani disponibili per Query Optimizer. Ad esempio, il cursore dinamico limita l'ottimizzatore all'utilizzo di join di loop nidificati.
Evita l'uso di query secondarie scalari non correlate È possibile riscrivere la query per rimuovere la sottoquery scalare non correlata come una query separata anziché come parte della query principale e archiviare l'output in una variabile, a cui si può fare riferimento nella query principale o in una parte successiva del batch. Ciò fornirà opzioni migliori a Optimizer, che possono aiutare a restituire stime accurate della cardinalità insieme a un piano migliore.
Evita le funzioni con valori di tabella (TVF) a più istruzioni I TVF con più dichiarazioni sono più costosi dei TFV in linea. SQL Server espande i TFV inline nella query principale così come espande le viste, ma valuta i TVF con più istruzioni in un contesto separato dalla query principale e materializza i risultati di più istruzioni in tabelle di lavoro temporanee. Il contesto e il tavolo di lavoro separati rendono costose le TVF con più dichiarazioni.
Crea un indice altamente selettivo La selettività definisce la percentuale di righe qualificanti nella tabella (numero di righe qualificante/numero totale di righe). Se il rapporto tra il numero qualificante di righe e il numero totale di righe è basso, l'indice è altamente selettivo ed è molto utile. Un indice non cluster è più utile se il rapporto è di circa il 5% o meno, il che significa che l'indice può eliminare il 95% delle righe dalla considerazione. Se index restituisce più del 5% delle righe in una tabella, probabilmente non verrà utilizzato; verrà scelto o creato un indice diverso oppure verrà scansionata la tabella.
Posiziona una colonna in un indice Anche l'ordine o la posizione di una colonna in un indice svolge un ruolo fondamentale per migliorare le prestazioni delle query SQL. Un indice può aiutare a migliorare le prestazioni della query SQL se i criteri della query corrispondono alle colonne rimaste più nella chiave dell'indice. Come best practice, la maggior parte delle colonne selettive dovrebbe essere posizionata più a sinistra nella chiave di un indice non cluster.
Elimina indici inutilizzatiL'eliminazione degli indici inutilizzati può aiutare a velocizzare le modifiche ai dati senza influire sul recupero dei dati. Inoltre, è necessario definire una strategia per i processi batch che vengono eseguiti di rado e utilizzano determinati indici. In questi casi, la creazione di indici prima dei processi batch e la successiva eliminazione al termine dei processi batch aiuta a ridurre il sovraccarico del database.
Creazione di statistiche e aggiornamenti È necessario occuparsi della creazione di statistiche e degli aggiornamenti regolari per le colonne calcolate e le multicolonne a cui si fa riferimento nella query; Query Optimizer utilizza le informazioni sulla distribuzione dei valori in una o più colonne di una tabella statistica per stimare la cardinalità, o il numero di righe, nel risultato della query. Queste stime della cardinalità consentono a Query Optimizer di creare un piano di query di alta qualità.
Rivisita le definizioni dello schema Ultimo ma non meno importante, rivedi le definizioni del tuo schema; tieni d'occhio che i vincoli FORIGEN KEY, NOT NULL e CEHCK appropriati sono in atto o meno. La disponibilità del vincolo giusto nel posto giusto aiuta sempre a migliorare le prestazioni della query, come il vincolo FORIGEN KEY aiuta a semplificare i join convertendo alcuni outer o semi-join in join interni e il vincolo CHECK aiuta anche un po' rimuovendo predicati non necessari o ridondanti.