Divergenze sulla velocità di esecuzione di query identiche

martedì 22 luglio 2008 - 18.16

tarabasch84 Profilo | Junior Member

Salve ragazzi,
ho realizzato una query di selezione parametrica in modo che l'utente possa, attrverso l'interfaccia web messa a disposizione, filtrare le sue ricerche. La query di selezione che ho tirato sù, viene richiamata dal CLR utilizzando LinqToSql in questo modo:

//richiamo la stored procedure attraverso il DataContext con LinqToSql
var objects = (from c in DataContext.nome_query(param1, param2, param3)
orderby c.nome_campo ascending
select c).ToList();

//pagino la selezione in base a due indici
var selection = objects.Skip(Convert.ToInt32(Session["start"])).Take(Convert.ToInt32(Session["page_count"]));

//popolo la griglia
this.dgv.datasource = selection;
this.dgv.databind();

Ora, tutto questo viene eseguito molto velocemente sul mio portatile in locale e per di più in debug. Mentre sul server tutto avviene molto più lentamente.
Velocità di connessione? No, in quanto le altre richieste avvengono normalmente. Risorse occupate? No, il server è sgombro.
Per di più ho eseguito la query includendo il piano di esecuzione allo scopo di verificare divergenze di velocità di esecuzione sia il locale che su server:
la velocità è identica. Allora il problema è nel CLR? Ma se in locale nonostante il debug è tutto più veloce? Insomma, non ci sto capendo più nulla....


Credo che parte della colpa sia di billy...

lbenaglia Profilo | Guru

>Per di più ho eseguito la query includendo il piano di esecuzione
>allo scopo di verificare divergenze di velocità di esecuzione
>sia il locale che su server:
>la velocità è identica.
Non ho capito, i due query plans sono identici in tutto e per tutto?

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

tarabasch84 Profilo | Junior Member

Ciao,
i due query plans sono praticamente identici anche perchè i due database (quello in locale e quello sul server) sono strutturati allo stesso modo e contengono la stessa mole di dati.


Credo che parte della colpa sia di billy...

lbenaglia Profilo | Guru

>i due query plans sono praticamente identici anche perchè i due
>database (quello in locale e quello sul server) sono strutturati
>allo stesso modo e contengono la stessa mole di dati.

La struttura non significa niente, dato che 2 db identici su due istanze distinte possono dare origine a piani di esecuzione COMPLETAMENTE differenti.
Verifica NEL DETTAGLIO i due piani di esecuzione...

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

tarabasch84 Profilo | Junior Member

Penso di aver migliorato il tempo di attesa che faceva andare in timeout il server. In pratica ho modificato la query eliminando un confronto nella clausola where con un parametro di input. Il confronto però l'ho delegato a LinqToSql nel CLR poco prima di effettuare l'ordinamento. Adesso la velocità di esecuzione è migliorata di gran lunga. Evidentemente quella condizione in t-sql non piaceva a sql server...
Ho provato a confrontare i piani di esecuzione, ma i valori espressi in percentuale sono identici. Quali valori dovrei prendere in considerazione?


Credo che parte della colpa sia di billy...

lbenaglia Profilo | Guru

>Ho provato a confrontare i piani di esecuzione, ma i valori espressi
>in percentuale sono identici.
Prima o dopo la nuova condizione nella clausola WHERE?

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

tarabasch84 Profilo | Junior Member

Beh, dopo aver applicato la modifica in t-sql e nel CLR.


Credo che parte della colpa sia di billy...

lbenaglia Profilo | Guru

>Beh, dopo aver applicato la modifica in t-sql e nel CLR.
Eh, quindi significa che prima i piani di esecuzione con molta probablilità erano differenti

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

tarabasch84 Profilo | Junior Member

Ho riapportato le vecchie modifiche alla query. Chiaramente il piano di esecuzione è cambiato. Il tutto l'ho testato in locale. La prima query conteneva la clausola di condizione, mentre la seconda no. Ebbene, presentano due piani di esecuzione diversi. Il primo piano di esecuzione sembra essere più performante del secondo, cioè quello con la condizione, peccato che poi non si dimostra così...


Credo che parte della colpa sia di billy...
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