QUERY 10 sec vista 10 min (query più lente dentro le viste)

giovedì 14 febbraio 2008 - 18.58

<<>> Profilo | Newbie

Dunque ho una bella vista piuttosto complessa che richiama altre viste con varie union, join con tabelle, funzioni, ecc

facendo select da questa vista e impostando un filtro sul campo che praticamente è chiave in tutto il db (il codice articolo) la vista impiega la bellezza di 10minuti per essere completata...

se invece estraggo il codice dalla vista aggiungo la clausola where con lo stesso filtro di cui sopra, la query impiega 10secondi... come sarebbe? SQL Server 2005 Express SP2 non fà la vista con tutti i risultati ed applica il filtro solo DOPO vero?

Come potrei risolvere? la vista in questione è a sua volta inserita in altre viste, potrei collassare tutto in un unica query enorme, ma poi se voglio modificare qlc ci ci capisce + niente? Va beh che il codice sql oramai è stabile, ma mi pare strano non sia possibile altrimento, o no?

HALT, mentre stò scrivendo ho avuto un idea, ho eseguito la query senza filtro....
ci impiega 20sec come è possibile che una query sia più lenta solo perchè è dentro una vista??

lbenaglia Profilo | Guru

>se invece estraggo il codice dalla vista aggiungo la clausola
>where con lo stesso filtro di cui sopra, la query impiega 10secondi...
>come sarebbe? SQL Server 2005 Express SP2 non fà la vista con
>tutti i risultati ed applica il filtro solo DOPO vero?

Confronta i piani di esecuzione delle due query e te ne renderai conto tu stesso

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

<<>> Profilo | Newbie

ci sono talmente tanti oggetti nel piano che ogniuno ha un impatto dello 0%.... beh chiaro... ma visualizzarli in lista o poterli ordinare no è?

cmq non capisco perchè la stessa query senza filtri abbia tempi di esecuzione diversi se eseguita dal cmd o dentro una vista...

lbenaglia Profilo | Guru

>ci sono talmente tanti oggetti nel piano che ogniuno ha un impatto
>dello 0%....
Se fossero tutti 0% la query impiegherebbe 0ms

>cmq non capisco perchè la stessa query senza filtri abbia tempi
>di esecuzione diversi se eseguita dal cmd o dentro una vista...
E' strano, dato che una vista non è altro che un comando di SELECT memorizzato in modo permanente nel db.
Quando la interroghi, SQL Server provvede ad estrarre e ad eseguire il codice in essa contenuto.
Per caso utilizzi viste indicizzate (materialized views)?

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

<<>> Profilo | Newbie

>>ci sono talmente tanti oggetti nel piano che ogniuno ha un impatto
>>dello 0%....
>Se fossero tutti 0% la query impiegherebbe 0ms

è si ma la maggiorparte se sono 0,qualocsa li arrotonda.. alcuni ovviamente hanno tipo il 3% ma sono gli scan degli indici delle tabelle, tutto normale, in entrambi i casi.
>
>>cmq non capisco perchè la stessa query senza filtri abbia tempi
>>di esecuzione diversi se eseguita dal cmd o dentro una vista...
>E' strano, dato che una vista non è altro che un comando di SELECT
>memorizzato in modo permanente nel db.
>Quando la interroghi, SQL Server provvede ad estrarre e ad eseguire
>il codice in essa contenuto.
>Per caso utilizzi viste indicizzate (materialized views)?

è magari... no, ci sono così tanti vincoli per poter indicizzare che ho rinunciato (la vista è cross db è già questo stronca la possibilità di creare indici)
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

<<>> Profilo | Newbie

ok, nella query alla vista c'era in + un TOP 100.... cioè ma se metto top 100 mi viene 4 minuti + lenta??

lbenaglia Profilo | Guru

>ok, nella query alla vista c'era in + un TOP 100.... cioè ma
>se metto top 100 mi viene 4 minuti + lenta??
C'era anche un ORDER BY?
In questo caso la lentezza può essere dovuta ad un ordinamento di tutte le righe restituite dalla vista per prendere solo le prime 100 che soddisfano la clausola di ordinamento.
Ad ogni modo la spiegazione reale la trovi nel piano di esecuzione...

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

<<>> Profilo | Newbie

no solo top 100... ci fosse stato un order by avrei anche potuto capire.. .anche se 4 minuti in + .....

dal piano di esecuzione il top 100 me lo segna come 0%... eh, bene...

Possibile che non sia possibile ordinare i task del piano ed ordinarli per impatto?
Ho visto che il piano si può salvare in xml, c'è un tool per manipolarlo e ordinare i task o me lo scrivo io?

lbenaglia Profilo | Guru

>no solo top 100... ci fosse stato un order by avrei anche potuto
>capire.. .anche se 4 minuti in + .....
Dipende dal numero di righe restituite e dagli indici (clustered) presenti.

>Possibile che non sia possibile ordinare i task del piano ed
>ordinarli per impatto?
>Ho visto che il piano si può salvare in xml, c'è un tool per
>manipolarlo e ordinare i task o me lo scrivo io?
Quello che vedi è l'output del piano di esecuzione.
Puoi modificarlo mediante hints.

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