Ottimizzazione delle Query (Parte III)

Pagina 3 di 3

Come ottimizzare la query?

Ok, adesso sappiamo tutto di come funziona il nostro motore"sotto al cofano" , come usiamo queste informazionia nostro vantaggio?

Ovviamente, fornendo al "motore" delle query chevengano interpretate correttamente e che diano meno dubbipossibile su quello che il motore deve fare, inoltre sipuo' agire anche sulla struttura del database, riducendoal minimo i problemi che esso puo' incontrare.

Indici

Obbligare il motore a scegliere gli indici giusti (o ascegliere gli indici in assoluto invece di passare tutta latabella come fa' a volte). Questo si fa' siaforzando l'uso di un certo indice mediante laclausola

SELECT .. FROM table WITH (INDEX n) ... 

nella SQL, sia costruendo "ad hoc" le query, comespiegato di seguito.

In alcuni casi (tabelle di piccole dimensioni) e'opportuno forzare il motore ad effettuare un TableScan.

Clausole WHERE

Un'espressione del tipo

WHERE campo >= valore * 12 + 3000   oWHERE SUBSTRING( campo, 1, 1) = 'C'

non risultera' nella selezione di un indice, anche se unindice e' disponibile per quel campo.

Una clausola del tipo

WHERE NOT campo = '...' oWHERE CAMPO != '...'

Non verra' usato per la selezione di un indice, quindievitare se possibile l'utilizzo di questo costrutto.

Un'espressione del tipo

WHERE CAMPO = 'valore'

e' l'optimum per la selezione se un indice unicoe' disponibile. Un range

BETWEEN oWHERE CAMPO >='..' AND CAMPO < '..'

viene subito dopo come termini di efficienza.Un'espressione aperta come

WHERE campo < 'valore'    oWHERE campo > 'valore'

e' il peggio che si possa avere come uso degli indici.

Clausole da evitare

Evitare dove possibile clausole OR o IN, inquanto questo tipo di "disgiunzioni" portano quasisicuramente alla creazione di una tabella temporanea perrisolvere la clausola, quindi un elevato input/output deldatabase stesso. Inoltre, se per risolvere una clausolaOR viene richiesto un TableScan (nessun uso diindice), lo stesso verra' usato per tutta la query.

Tabelle temporanee

Una tabella temporanea e' creata per risolvere i problemidati da

  • GROUP BY
  • ORDER BY se nessun indice e' disponibile o se l'ordine e' in conflitto con il SORT ORDER del server stesso
  • SELECT INTO
  • DISTINCT
  • Subquery

Se nessun indice e' disponibile per una Join, verra'costruita una tabella temporanea per la piu' piccoladelle due tabelle della Join, ed un indice clusteredverra' costruito sulla tabella temporanea.

 

Progettare il database e l'applicazione

Una parte di ottimizzazione si fa' anche progettando BENEil database, prima ancora di fare una sola Select e'possibile lavorare per avere un database ottimizzato.

Evitare (se possibile) aggiornamenti multipli sulla stessa"pagina" , questo avviene quasi sempre sulletabelle non-indicizzate, in quanto tutte le aggiunte sonofatte sull'ultima pagina "aperta".

Evitare transazioni che richiedano l'interventodell'utente, questo richiede il mantenimento di Lock pertutta la durata della transazione, aumentando lapossibilita' che si abbiano degli accessi concorrenti.

Usare Stored Procedures e View per accedere ai dati dovepossibile, le SP e le Views sono compilate all'internodel server, quindi il "piano di esecuzione" e'gia' memorizzato e non deve essere interpretato ognivolta.

Creare gli indici "giusti" sulle varie tabelle.Ogni indice deve essere mantenuto, quindi evitare di creareindici su tutti i campi ma creare solo quelli essenziali.Ricordarsi che se la sequenza dei campi non corrispondeESATTAMENTE a quanto richiesto, l'indice non viene usato.

Evitare (dove possibile) le OUTER JOIN (LEFT JOIN,RIGHTJOIN), soprattutto su tabelle in cui i campi di Join possonocontenere NULL.

 

Controllare se le cose funzionano

Utilizzando SET SHOWPLAN ON, si puo' controllarese la Query che abbiamo ottimizzato e' stata ottimizzatacome noi avevamo previsto. In caso contrario, e' il casodi ripensare le nostre scelte e scegliere (magari) un diversomodo di ottimizzazione.

 

Bibliografia ed altre risorse sull'argomento

"An Introduction to Database Systems" -Addison/Wesley, 1990
"Fundamentals of Database Systems" -Benjamin/Cummings, 1989
"Designing Client-Server Applications for EnterpriseDatabase Connectivity" - MSDN Library, TechnicalArticles.
"Microsoft SQL Server Network IntegrationArchitecture." - MSDN Library, Technical Articles.
"Microsoft Open Data Services: ApplicationSourcebook." - MSDN Library, Technical Articles.
"Maximizing Performance Using Binary Columns andBitwise Operations in Microsoft SQL Server for WindowsNT." - MSDN Library, Technical Articles.
"Understanding the Microsoft SQL ServerOptimizer." - Microsoft Networking Journal, January1991.
"Backup and Recovery Guidelines for Microsoft SQLServer." - MSDN Library, Technical Articles.
"Optimization of Query Evaluation Algorithms." -ACM TODS, June 1979.



Ti potrebbe interessare anche

commenta la notizia