Problemi di performance con l'uso del costrutto CASE

mercoledì 19 novembre 2008 - 12.19

lukepet Profilo | Junior Member

Ciao a tutti, ho un problemino con una query SQL e volevo chiedere un vostro parere.

Ho una pagina aspx che permette di stampare dei report per alcune statistiche. Per popolare il report mi appoggio ad una query SQL generata dinamicamente.

La query mi permette di ricavare delle quantità totali suddivise per intervalli temporali.
Per ottenere ciò ho sfruttato il costrutto CASE; in pratica ho una cosa di questo tipo:

SELECT Codice1, Codice2, Codice3, sum(case when data <= data1 and data >= data2 then quantita end) as qt1, sum(case when data <= data3 and data >= data4 then quantita end) as qt2, .... FROM myView GROUP BY Codice1, Codice2, Codice3

il problema è che gli intervalli che la query calcola sono una decina e, quando eseguo l'operazione in remoto, l'esecuzione dell'interrogazione impiega molto tempo ed infine fallisce (mentre in locale non ho problemi).
Purtroppo l'hosting a cui mi appoggio non è molto performante e quindi stavo pensando di ristrutturare la query per renderla più leggera. Il costrutto CASE è decisamente pensante e riflettevo su un modo per riuscire ad eliminarlo ottenendo lo stesso risultato.

Che voi sappiate c'è qualche alternativa all'istruzione CASE? O in caso contrario che approccio potrei seguire per risolvere il problema?

Vi ringrazio in anticipo per ogni informazione.

alx_81 Profilo | Guru

>Ciao a tutti, ho un problemino con una query SQL e volevo chiedere
>un vostro parere.
Ciao!

>Ho una pagina aspx che permette di stampare dei report per alcune
>statistiche. Per popolare il report mi appoggio ad una query
>SQL generata dinamicamente.
E già questo non è una gran cosa per le performance.. Sei proprio costretto?

>il problema è che gli intervalli che la query calcola sono una
>decina e, quando eseguo l'operazione in remoto, l'esecuzione
>dell'interrogazione impiega molto tempo ed infine fallisce (mentre
>in locale non ho problemi).
Se sono fissi, eviterei l'sql dinamico. Comunque, hai previsto degli indici? Che RDBMS stai usando?

>Che voi sappiate c'è qualche alternativa all'istruzione CASE?
>O in caso contrario che approccio potrei seguire per risolvere
>il problema?
Cerchiamo di capire prima le cose che ti ho chiesto..

>Vi ringrazio in anticipo per ogni informazione.
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lukepet Profilo | Junior Member

Dunque.

Il report ho proprio la necessità di renderlo accessibile da web in modo che ogni utente possa generare le statistiche che desidera e scaricarle.

Gli intervalli dei periodi sono suddivisi a gruppi; cioè hanno una struttura fissa (ad esempio ogni 15 giorni) ma l'arco di tempo da considerare può variare. E' per questo che genero dinamicamente la query nel code behind e la utilizzo per interrogare una vista che continene tutte le informazioni che mi servono.

gabriel81 Profilo | Junior Member

Dico un idea, magari stupida..

l'utente seleziona gli intervalli e lancia la GENERAZIONE DELLA STATISTICA.
Poi viene ridirezionato sulla pagina che vuoi tu.
nel frattempo l'applicazione genera un file xml con i dati dei report in un altro thread
Quando il file della statistica è pronta compare una notifica e l'utente (che nel frattempo ha guardato il meteo)
può andare a leggersela.
http://www.myspace.com/madmack1981

lukepet Profilo | Junior Member

Potrebbe essere un'idea...comunque sono riuscito a risolvere poco fa.

Mi sono reso conto che il problema non era tanto la query, quanto la vista da cui venivano letti i dati. Infatti la vista era piuttosto pesante e di conseguenza anche l'esecuzione dell'interrogazione su di essa. Così l'ho ristrutturata ottimizzandone le performance e adesso non ho più il problema.

Grazie lo stesso per il vostro interessamento.
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