Questa la voglio raccontare. Non perchè voglia fare il
figo, ma perchè dimostra che fare le cose in un modo piuttosto che in un altro
possa davvero fare la differenza. Non scenderò molto nei dettagli, perchè
sarebbe inutile e troppo complicato (l'SQL non è completamente frutto della mia
mente).
Dunque, parliamo di un SQL Server 2000 SP4 installato su un
Windows 2000 Professional SP4.
Il sistema monta 512Mb di RAM
e non è nulla di speciale. E' il mio PC che uso in ufficio.
Dunque, ho uno
script SQL di 400 linee che:
- dichiara un certo numero di variabili @xyz (tutte int)
- dichiara al momento 12 tabelle virtuali (tramite declare @tabella table)
- valorizza le variabili e riempie tutte le tabelle virtuali (tramite,
ovvio, INSERT INTO)
Fino a questo punto lo script impiega 1 secondo per girare e non restituisce
nulla. Ottimo, fin qua nessun problema. Il passo successivo è una SELECT (solo
lei occupa 60 linee dello script) che è quella che effettivamente mi serve
perchè ritorna i valori ad una procedura VBA. Concettualmente si tratta di una
SELECT che va in left outer join con un'altra SELECT, più
interna. La faccio girare premendo F5 del mio Query Analyzer. Ecco la
status-bar del mio Query Analyzer dopo che ho fatto girare
lo script:
Per restituirmi 7982 record, lo script ha girato per
1h21m35s.
Non c'è alcun errore. Il task manager è rimasto per
tutto questo tempo in questa situazione:
con un'occupazione di RAM di quasi 230Mb.
Beh, insomma, ho risolto come ho
risolto?
Ho preso la SELECT interna, ho riempito una tabella temporanea (#tab_inner)
con una bella SELECT INTO. Poi ho preso la query e ho modificato la left
outer join in modo che usasse questa #tab_inner invece del suo
corrispondente codice SQL.
Beh, vi dirò, il tempo di esecuzione è passato
dall'ora e mezza di prima a soli 3
secondi.
Questo vuol dire ottimizzare!!!!
powered by IMHO 1.2