SELECT: velocita varia grazie a Enterprise manager?

lunedì 21 aprile 2008 - 09.01

Klaus-zanini Profilo | Senior Member

Ciao a tutti,
ho creato una vista (su MSDE) un po' complessa che carica campi (tutti indicizzati) di tabelle in join tra loro. Nella select inserisco anche un campo risultato di una funzione che calcola differenze tra 2 campi di una delle tabelle in questione.
Quanto faccio girare la select nel SQL Query Analyzer ci mette circa 1 minuto e 30 secondi (ho abbastanza dati!). Ho provato anche a fare filtri e mostrare meno campi, ma non cambia di molto.
In particolare ho provato a cercare il campo che rallentava il tutto facendo la select solo di tale campo ed era uno di quelli calcolati dalla funzione.
Un po' per sperimentare ho creato un campo in più sulla tabella con l'ausilio di Enterprise Manager: risultato la stessa select ci mette 3 secondi netti!!!

E rimane così fino a quando il pc rimane acceso. Appena riavvio torna la lentezza di prima. Faccio una modifica (cancello il campo aggiunto prima) e ritorna a velocita di 3 secondi!!!

Ho pensato che il campo in più fosse la ragione, invece quando lo creo da Sql Query Analyzer, la velocità non cambia.

Sembra che al momento del salvataggio della struttura Enterprise Manager faccia qualcosa che una normale ADD non fa...
Mi sapreste dire cosa e come replicarlo in modo che al riavvio io possa ritrovare le medesime condizioni di velocità?

amelix Profilo | Expert

Nella clauso from hai inserito dbo.[Tabella] o usi direttamente [Tabella]?
Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

Klaus-zanini Profilo | Senior Member

Non lo metto di solito.
Ho fatto una prova con un campo che solitamente mi carica in 18 secondi, mettendolo ci mette 7 secondi. Poi l'ho tolto e mi mantiene 7 secondi.
Quindi dovrei mettere [dbo].[table] in tutti i punti (comprese le funzioni) per velocizzare il tutto?
Ma c'è una spiegazione anche per quel che riguarda quanto mi è accaduto con l'Enterprise Manager?

lbenaglia Profilo | Guru

>Sembra che al momento del salvataggio della struttura Enterprise
>Manager faccia qualcosa che una normale ADD non fa...
Utilizzando il SQL Profiler sei in grado di catturare il comando SQL generato da EM quando confermi la modifica.

>Mi sapreste dire cosa e come replicarlo in modo che al riavvio
>io possa ritrovare le medesime condizioni di velocità?
Riavviando il servizio vai a deallocare tutte le cache, di conseguenza alla prima esecuzione dovranno essere ricalcolati i query plans delle query ma soprattutto ricaricare da disco le data pages interessate (operazione estremamente lenta se paragonata alla lettura delle stesse pagine dalla buffer cache).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Klaus-zanini Profilo | Senior Member

>Riavviando il servizio vai a deallocare tutte le cache, di conseguenza
>alla prima esecuzione dovranno essere ricalcolati i query plans
>delle query ma soprattutto ricaricare da disco le data pages
>interessate (operazione estremamente lenta se paragonata alla
>lettura delle stesse pagine dalla buffer cache).

Questo lo capisco ma a me capita che la velocità aumenta immediatamente dopo la creazione del campo in più, quindi non credo sia una questione di cache anche perché altrimenti mi aspetterei di avere una maggiore velocità dopo il primo caricamento sempre e non solo se faccio una modifica alla struttura.

lbenaglia Profilo | Guru

>Questo lo capisco ma a me capita che la velocità aumenta immediatamente
>dopo la creazione del campo in più, quindi non credo sia una
>questione di cache anche perché altrimenti mi aspetterei di avere
>una maggiore velocità dopo il primo caricamento sempre e non
>solo se faccio una modifica alla struttura.

Senza query plan stiamo parlando di aria fritta.
Compara i piani di esecuzione prima e dopo le modifiche ed osserva la differenze...

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Klaus-zanini Profilo | Senior Member

Ho provato a visualizzare il query plan sia prima di inserire il campo che dopo, ma risulta uguale.
Comincio a pensare che cambia come vuole lui!
Mi hanno detto che ad ogni modifica fatta alla struttura dell'Enterprise Manager questi distrugge e ricrea la tabella, è vero? Se sì potrebbe essere che lui nella ricostruzione riassegna indici o li ottimizza?

Eventualmente avete qualche idea per rendere più veloce la ricerca?
Allego il risultato del query plan, magari riuscite a vedere meglio il vero collo di bottiglia...


867x396 35Kb

lbenaglia Profilo | Guru

>Ho provato a visualizzare il query plan sia prima di inserire
>il campo che dopo, ma risulta uguale.
>Comincio a pensare che cambia come vuole lui!


>Mi hanno detto che ad ogni modifica fatta alla struttura dell'Enterprise
>Manager questi distrugge e ricrea la tabella, è vero?
Dipende dal genere di modifica.
Ad esempio, questo accade se si aggiunge/toglie l'attributo IDENTITY.
Come ti ho indicato prima, utilizza il SQL Profiler per catturare i comandi SQL generati da Enterprise Manager e avrai il dettaglio di cosa accade dietro le quinte.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5