Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 10757|Risposta: 0

[Fonte] 30 punti per migliorare la velocità delle query SQL

[Copiato link]
Pubblicato su 27/01/2015 20:09:54 | | |

1. Per ottimizzare la query, dovresti cercare di evitare la scansione completa delle tabelle e prima considerare la creazione di un indice sulle colonne coinvolte in dove e ordine per situazione.



2. Cerca di evitare il giudizio di valore nullo sui campi della clausola where, altrimenti il motore abbandonierà l'uso degli indici ed eseguirà una scansione completa delle tabelle, come ad esempio:

seleziona id da t dove num è nullo

Puoi impostare il valore predefinito di 0 sul num, assicurarti che non ci sia alcun valore nullo nella colonna numero della tabella, e poi interrogare così:

seleziona l'ID da t dove num=0



3. Cerca di evitare di usare operatori != o <> nella clausola where, altrimenti il motore abbandonerà l'uso degli indici ed eseguirà la scansione a tabelle complete.



4. Dovresti cercare di evitare di usare OR nella clausola where per unire la condizione, altrimenti il motore abbandone l'uso degli indici ed eseguirà una scansione completa della tabella, ad esempio:

seleziona ID da t dove num=10 o num=20

Puoi fare query così:

seleziona l'ID da t dove num=10

Unione Tutti

seleziona id da t dove num=20



5.in e non in devono essere usati con cautela, altrimenti porterà a una scansione completa della tabella, come ad esempio:

seleziona l'ID da t dove num in(1,2,3)

Per valori continui, non usare in se puoi usare tra:

seleziona l'ID da t dove num è tra 1 e 3



6. La seguente query porterà anch'essa a una scansione completa della tabella:

Seleziona ID da T dove il nome è '%abc%'

Per migliorare l'efficienza, considera la ricerca a testo completo.



7. Se usi un parametro in una clausola where, causerà anche una scansione completa della tabella. Poiché SQL risolve solo le variabili locali a runtime, ma l'ottimizzatore non può rimandare la selezione dei piani di accesso a runtime; Deve essere selezionato al momento della compilazione. Tuttavia, se un piano di accesso viene stabilito al momento della compilazione, il valore della variabile è ancora sconosciuto e quindi non può essere utilizzato come elemento di input per la selezione dell'indice. Le seguenti dichiarazioni saranno scansionate integralmente:

seleziona ID da t dove num=@num

Puoi forzare la query a usare invece un indice:

Seleziona l'ID da t con (Index(Index(Nome indice)) dove num=@num



8. Cerca di evitare di esprimere campi nella clausola where, il che porterebbe il motore ad abbandonare l'uso degli indici a favore della scansione completa della tabella. Per esempio:

seleziona l'ID da t dove num/2=100

Dovrebbe essere cambiato in:

seleziona ID da t dove num=100*2



9. Cerca di evitare di eseguire operazioni di funzione sui campi della clausola where, il che porterebbe il motore ad abbandonare l'uso degli indici a favore della scansione completa della tabella. Per esempio:

seleziona l'ID da t dove substring(name,1,3)='abc' --name id che inizia con abc

Seleziona l'ID da t dove datediff(day,createdate,'2005-11-30')=0--'2005-11-30' generato l'ID

Dovrebbe essere cambiato in:

Seleziona ID da T dove il nome è 'ABC%'

seleziona ID da t dove creatate>='2005-11-30' e creatate<'2005-12-1'



10. Non eseguire funzioni, operazioni aritmetiche o altre operazioni di espressione a sinistra del "=" nella clausola where, altrimenti il sistema potrebbe non essere in grado di usare correttamente l'indice.



11. Quando si utilizza un campo indice come condizione, se l'indice è un indice composito, allora il primo campo nell'indice deve essere usato come condizione per garantire che il sistema utilizzi l'indice, altrimenti l'indice non verrà utilizzato e l'ordine dei campi deve essere il più possibile coerente con l'ordine dell'indice.



12. Non scrivere alcune query prive di significato, come generare una struttura di tabella vuota:

Seleziona col1,col2 in #t da T dove 1=0

Questo tipo di codice non restituisce alcun set di risultati, ma consuma risorse di sistema, quindi dovrebbe essere cambiato in qualcosa del genere:

crea tabella #t(...)



13. Molte volte è una buona scelta sostituire in con esiste:

seleziona num da a dove num in (seleziona num da b)

Sostituisci con la seguente affermazione:



Seleziona num da A dove esiste (seleziona 1 da B dove num=A.num)

14. Non tutti gli indici sono validi per le query, SQL si basa sui dati nella tabella per ottimizzare la query; quando la colonna dell'indice presenta una grande quantità di duplicazione dei dati, le query SQL potrebbero non usare l'indice, ad esempio una tabella ha un campo sesso, maschio e femmina sono quasi metà ciascuno, quindi anche se l'indice è costruito sul sesso, non avrà un ruolo nell'efficienza delle query.



15. Più indici non sono meglio è, l'indice può certamente migliorare l'efficienza della selezione corrispondente, ma riduce anche l'efficienza di inserimento e aggiornamento, perché l'indice può essere ricostruito quando viene inserito o aggiornato, quindi come costruire un indice deve essere considerato con attenzione, a seconda della situazione specifica. È meglio non avere più di 6 indici in una tabella e, se ce ne sono troppi, considerare se sia necessario costruire indici su alcune colonne usate raramente.



16. Evitare di aggiornare il più possibile le colonne di dati degli indici clusterizzati, perché l'ordine delle colonne di dati degli indici raggruppati è l'ordine fisico di archiviazione dei record della tabella e, una volta cambiato il valore della colonna, ciò porterà all'aggiustamento dell'ordine dell'intero record della tabella, consumando risorse considerevoli. Se la tua applicazione deve aggiornare frequentemente le colonne di indice clusterizzate, devi considerare se costruire l'indice come un cluster di indice.



17. Cerca di usare campi numerici e cerca di non progettare campi che contengano solo informazioni numeriche come caratteri, il che ridurrà le prestazioni di query e connessioni e aumenterà il sovraccarico di archiviazione. Questo perché il motore confronta ogni carattere della stringa uno per uno durante l'elaborazione di query e join, mentre per i tipi numerici è necessario confrontarlo solo una volta.



18. Usa varchar/nvarchar invece di char/nchar il più possibile, perché innanzitutto, lo spazio di archiviazione sul campo più lungo può risparmiare spazio, e in secondo luogo, per le query, l'efficienza di ricerca in un campo relativamente piccolo è ovviamente più alta.



19. Non usare seleziona * da t da nessuna parte, sostituisci "*" con una lista specifica di campi e non restituire campi non utilizzati.



20. Prova a usare variabili di tabella invece di tabelle temporanee. Se la variabile della tabella contiene una grande quantità di dati, si noti che l'indice è molto limitato (solo l'indice principale della chiave).



21. Evitare di creare e cancellare frequentemente tabelle temporanee per ridurre il consumo di risorse delle tabelle di sistema.

22. Le tabelle temporanee non sono inutilizzabili e usarle correttamente può rendere alcune routine più efficaci, ad esempio quando è necessario fare riferimento ripetuto a un dataset in una tabella grande o in una tabella comunemente utilizzata. Tuttavia, per eventi una tantum, è meglio usare una tabella di esportazione.



23. Quando si crea una tabella temporanea, se la quantità di dati inseriti contemporaneamente è elevata, allora si può usare select into invece di create table per evitare di aumentare la velocità con un gran numero di log; Se la quantità di dati non è grande, per facilitare le risorse della tabella di sistema, dovresti prima creare la tabella e poi inserirla.



24. Se viene utilizzata una tabella temporanea, assicurarsi di eliminare esplicitamente tutte le tabelle temporanee alla fine della procedura memorizzata, troncare prima la tabella e poi toglierla, così da evitare che la tabella di sistema venga bloccata a lungo.



25. Cerca di evitare di usare il cursore, perché l'efficienza del cursore è scarsa; se i dati gestiti dal cursore superano le 10.000 righe, allora dovresti considerare la riscriverla.



26. Le soluzioni basate su insiemi dovrebbero essere cercate per risolvere problemi prima di utilizzare metodi basati su cursore o tabelle temporanee, che spesso sono più efficaci.



27. Come le tabelle temporanee, i cursori non sono inutilizzabili. Usare FAST_FORWARD cursori per piccoli dataset è spesso meglio rispetto ad altri metodi di elaborazione riga per riga, specialmente se devi fare riferimento a più tabelle per ottenere i dati necessari. Le routine che includono il "totale" nel set di risultati sono solitamente più veloci di quelle eseguite con il cursore. Se il tempo di sviluppo lo permette, si possono provare sia metodi basati su cursori che su insiemi per vedere quale funziona meglio.



28. Imposta SET NOCOUNT ON all'inizio di tutte le stored procedure e trigger, e IMPOSTA NOCOUNT OFF alla fine. Non è necessario inviare DONE_IN_PROC messaggi al client dopo aver eseguito ogni istruzione della procedura memorizzata e del trigger.



29. Cercare di evitare operazioni di transazione di grandi dimensioni e migliorare la capacità di concorrenza del sistema.



30. Cerca di evitare di restituire dati grandi al client; se il volume di dati è troppo grande, dovresti considerare se la richiesta corrispondente sia ragionevole.




Precedente:Sistema CentOS 6.5 con macchina virtuale Xen 4.1.2
Prossimo:Come migliorare la velocità delle query SQL Server
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com