Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
ASP.NET 2.0 / 3.5 / 4.0
Web App multiutente
lunedì 20 dicembre 2010 - 11.28
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
C#
|
.NET 2.0
|
Windows Server 2003
|
Visual Studio 2008
|
MySQL 5.0
simonep
Profilo
| Newbie
12
messaggi | Data Invio:
lun 20 dic 2010 - 11:28
Salve!
avrei un problemino che non riesco bene a risolvere.. e speravo nel vostro aiuto...
Ho sviluppato una web application in c# collegata a un db Mysql
Effettua delle interrogazioni su diverse tabelle, creando delle query dinamiche che permettono di estrarre dei dati entro determinati range.
la pecca sostanziale è la complessità delle query, che necessitano in alcuni casi di diversi minuti per essere eseguite!
la faccio semplice:
ho creato una gridview all'interno di un updatepanel, un bottone "genera report", e al click la grid view viene popolata!
l'ho inserita all'interno dell'updatepanel per permettermi tramite l'updateprogress di inserire un testo per l'utente "caricamento in corso..."
il problema sta nel fatto che nel mentre che il sitema impiega quei 4 minuti per l'esecuzione della query, l'applicazione risulta irraggiungibile per gli altri utenti!!!
per irraggiungibile intendo che la web app risulta impegnata.... un bel problema..
ho cercato un po' in rete per capire se posso convertire la popolazione della gridview in un modo asincrono... ma ho trovato solo chiamate asincrone per web service...
ho pensato all'utilizzo dei thread, ma non riesco a far popolare correttamente la grid view!!!
qualcuno di voi ha già incontrato questo problema??!??
Grazie mille per l'aiuto!
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mar 21 dic 2010 - 10:17
>Salve!
Ciao
>la pecca sostanziale è la complessità delle query, che necessitano
>in alcuni casi di diversi minuti per essere eseguite!
Eh, minuti = ere. Non ti puoi permettere risposte così poco prestanti..
Quanti dati hai? Che query fai? Perchè a volte basta indicizzare a modo per ottenere risultati incredibili.
Però consentire filtri su intere tabelle enormi, magari denormalizzate, diventa veramente una prassi da non seguire..
>il problema sta nel fatto che nel mentre che il sitema impiega
>quei 4 minuti per l'esecuzione della query, l'applicazione risulta
>irraggiungibile per gli altri utenti!!!
Ma sono letture oppure transazioni in cui crei anche dei lock non condivisi? Perchè da come dici, per impegnare il server così tanto, o riempi di connessioni il web server, o tieni appese delle transazioni che devono essere serializzate, o saturi la banda..
>ho cercato un po' in rete per capire se posso convertire la popolazione
>della gridview in un modo asincrono... ma ho trovato solo chiamate
>asincrone per web service...
Non è tanto un problema di "asincronia". C'è un problema alla base.. Partiamo daccapo.. rispondi alle prime domande..
>Grazie mille per l'aiuto!
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
simonep
Profilo
| Newbie
12
messaggi | Data Invio:
mar 21 dic 2010 - 11:05
>>Salve!
>Ciao
>
Grazie per aver riposto! :)
>>la pecca sostanziale è la complessità delle query, che necessitano
>>in alcuni casi di diversi minuti per essere eseguite!
>Eh, minuti = ere. Non ti puoi permettere risposte così poco prestanti..
>Quanti dati hai? Che query fai? Perchè a volte basta indicizzare
>a modo per ottenere risultati incredibili.
>Però consentire filtri su intere tabelle enormi, magari denormalizzate,
>diventa veramente una prassi da non seguire..
>
allora, quello che mi è stato richiesto è di creare un'interfaccia utente che permettesse di interrogare il database in modo semplice, da un utente che non conosce il linguaggio sql.
in sintesi ho creato una web app che, in base a un template xml che ho creato, mi costruisce l'interfaccia grafica (es. checkbox per le colonne da visualizzare, liste di valori in drop down list per permettere delle join, funzioni da richiamare sempre tramite la spunta di checkbox, ecc....)
per ogni controllo che viene generato in maniera dinamica, utilizzo un ascx diverso creato da me, che contiene diverse proprietà relative al tipo di dato...
per generarmi la query per l'estrazione dei dati, mi scorro questi ascx e mi costruisco la query...
il problema è che questa puo' risultare mooolto complessa, infatti nella stessa query possono essere richiamate diverse funzioni, che vanno a cercare dati su diverse tabelle...
hai qualche soluzione alternativa per una query dinamica? :)
per quanto riguarda l'indicizzazione le tabelle contengono già gli indici, forse anche troppi! ma questi non mi è permesso modificarli!
pensi che troppi indici possano creare problemi? (il database è Mysql, ed è la prima volta che lo utilizzo, ho sempre utilizzato sql server..)
>>il problema sta nel fatto che nel mentre che il sitema impiega
>>quei 4 minuti per l'esecuzione della query, l'applicazione risulta
>>irraggiungibile per gli altri utenti!!!
>Ma sono letture oppure transazioni in cui crei anche dei lock
>non condivisi? Perchè da come dici, per impegnare il server così
>tanto, o riempi di connessioni il web server, o tieni appese
>delle transazioni che devono essere serializzate, o saturi la
>banda..
sono semplicemente delle letture, semplici query... in un caso particolare ho all'interno della procedura un while che scorre un range di date, e per ogni ciclo inserisce un record in una tabella temporanea, alla fine la procedura restituirà la select della tabella temporanea!
>
>>ho cercato un po' in rete per capire se posso convertire la popolazione
>>della gridview in un modo asincrono... ma ho trovato solo chiamate
>>asincrone per web service...
>Non è tanto un problema di "asincronia". C'è un problema alla
>base.. Partiamo daccapo.. rispondi alle prime domande..
tra l'altro questo accade anche quando genero un pdf del report, data la mole dei dati, magari sui 200.000 record, e la complessità della formattazione, ci impiega un po' a costruire il pdf, e l'applicazione non risponde a gli altri utenti!
>
>>Grazie mille per l'aiuto!
>di nulla!
>
E GRAZIE ANCORA!
>--
>Alessandro Alpi | SQL Server MVP
>MCP|MCITP|MCTS|MCT
>
>
http://www.alessandroalpi.net
>
http://blogs.dotnethell.it/suxstellino
>
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
ven 24 dic 2010 - 11:37
>hai qualche soluzione alternativa per una query dinamica? :)
Se la query è complessa, non è detto che debba essere pesante. Probabilmente quello che generi fa troppi scan, usa pochi indici (se ci sono non significa che il motore li usi come vuoi) e costringe il Query Engine a fare voli pindarici per ottenere il dato. Il database è normalizzato oppure ha entità su mega tabelloni in cui c'è tutto di tutto?
>per quanto riguarda l'indicizzazione le tabelle contengono già
>gli indici, forse anche troppi! ma questi non mi è permesso modificarli!
>pensi che troppi indici possano creare problemi? (il database
>è Mysql, ed è la prima volta che lo utilizzo, ho sempre utilizzato
>sql server..)
beh.. diciamo che il motore dovrebbe scegliere in base a "statistiche". Più ce ne sono e più sono disordinate, più fa fatica
>sono semplicemente delle letture, semplici query... in un caso
>particolare ho all'interno della procedura un while che scorre
>un range di date, e per ogni ciclo inserisce un record in una
>tabella temporanea, alla fine la procedura restituirà la select
>della tabella temporanea!
eh.. non è che sia un gran iter da seguire. Ricordati che siamo su RDBMS, devi ragionare SET BASED non a cicli, altrimenti per forza avrai dei ritardi..
se sono letture, leggi, non inserire ciclicamente. Se c'è un range, componi la where sul range e non usare temporanee..
>tra l'altro questo accade anche quando genero un pdf del report,
>data la mole dei dati, magari sui 200.000 record, e la complessità
>della formattazione, ci impiega un po' a costruire il pdf, e
>l'applicazione non risponde a gli altri utenti!
ti dico, nella realtà in cui sono, supero il miliardo di righe
, di sicuro 200.000 non sono per niente proibitive (certo, conta anche l'hardware e la configurazione dei server).
Posso capire che il render del pdf ci metta molto, ma potresti pensare di farlo in asincrono e di non bloccare l'applicazione. Però, se sono d'accordo sul "perdere tempo" nel render, non lo sono per le letture.
Se hai un po' di tabelle popolate, una query da provare, e me le esporti su un backup sql server, vediamo cosa succede.. Non credo sia un problema di db, ma di come hai scritto le query. Mi spaventa un po' l'approccio iterativo usato così su un RDBMS..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
simonep
Profilo
| Newbie
12
messaggi | Data Invio:
mar 11 gen 2011 - 09:29
>>sono semplicemente delle letture, semplici query... in un caso
>>particolare ho all'interno della procedura un while che scorre
>>un range di date, e per ogni ciclo inserisce un record in una
>>tabella temporanea, alla fine la procedura restituirà la select
>>della tabella temporanea!
>eh.. non è che sia un gran iter da seguire. Ricordati che siamo
>su RDBMS, devi ragionare SET BASED non a cicli, altrimenti per
>forza avrai dei ritardi..
>se sono letture, leggi, non inserire ciclicamente. Se c'è un
>range, componi la where sul range e non usare temporanee..
>
l'inserimento nella tabella temporanea deriva dalla necessità di creare una tabella pivot con le date, ora ti faccio l'esempio:
CREATE DEFINER=`root`@`localhost` PROCEDURE `drs_proc1`(ID_Pool varchar(4), StartDate DateTime, EndDate DateTime, SitPrenot varchar(1))
begin
DROP TEMPORARY TABLE IF EXISTS tbl_temp;
CREATE TEMPORARY TABLE tbl_temp (giorno varchar(2), settimana varchar(2), mese varchar(2), anno varchar(4), bn int, rn int, tot double ) ;
while StartDate <= EndDate do
INSERT INTO tbl_temp (giorno, settimana, mese, anno, bn, rn, tot)
Select DATE_FORMAT(StartDate,'%d'), DATE_FORMAT(StartDate,'%v'), DATE_FORMAT(StartDate,'%m'), YEAR(StartDate), SUM(bednight), SUM(roomnight), SUM(tot)
from
(
Select StartDate,
count(costo.ID_Prenotazione) as 'bednight',
COUNT(DISTINCTROW costo.cam) as 'roomnight',
SUM(costo.PrezzoConcordatoComplessivo / DATEDIFF(costo.DataFinePrenotazione,costo.DataInizioPrenotazione)) as 'tot'
from view_prenotagenzie
left outer join costo
on costo.ID_prenotazione = view_prenotagenzie.ID_Prenotazione
where view_prenotagenzie.codicePool = ID_Pool
AND view_prenotagenzie.situazioneprenotazione = SitPrenot
AND costo.DataInizioPrenotazione <= StartDate
and costo.DataFinePrenotazione > StartDate
group by view_prenotagenzie.ID_Prenotazione
) as tb;
SET StartDate:= ADDDATE(StartDate,1);
end while;
Select * from tbl_temp;
end
quella select alla fine mi permette di usare il mysqldataadapter e fare il fill su una datatable!
c'e' un modo + semplice per non usare la tabella temporanea?
grazie mille!!!!
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mar 11 gen 2011 - 12:13
>quella select alla fine mi permette di usare il mysqldataadapter e fare il fill su una datatable!
ok, ma infatti non è quello il problema
>c'e' un modo + semplice per non usare la tabella temporanea?
il problema non è la temp, è il ciclo. Non puoi creare una select che prenda tutti i periodi raggruppandoli e usare direttamente quella?
per quale motivo devi farla data per data. Ricavale tutte e poi fai le aggregazioni che ti servono..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
simonep
Profilo
| Newbie
12
messaggi | Data Invio:
gio 13 gen 2011 - 13:09
>>quella select alla fine mi permette di usare il mysqldataadapter e fare il fill su una datatable!
>ok, ma infatti non è quello il problema
>
>>c'e' un modo + semplice per non usare la tabella temporanea?
>il problema non è la temp, è il ciclo. Non puoi creare una select
>che prenda tutti i periodi raggruppandoli e usare direttamente
>quella?
>per quale motivo devi farla data per data. Ricavale tutte e poi
>fai le aggregazioni che ti servono..
>--
>
il problema è che il calcolo lo devo fare per ogni giorno e quel while è indispensabile!
ho provato in questo modo:
ho eliminato la tabella temporanea e lasciato il while, ora mi crea tramite il Fill del mysqldataadapter un dataset con un casino di tabelle, una per ogni giorno, e mi faccio le sum lato codice... solo che ora è lento lato codice! perchè per ogni datatable contenuta nel dataset devo fare le somme, non c'è un metodo per renderlo + veloce?
magari al posto di restituirmi un dataset con n tabelle, un merge di tutte le tabelle? cosi le somme le faccio sempre sulla stessa?
a rigor di logica in questo modo dovrebbe essere + veloce piuttosto che scorrersi tutte quelle tabelle no?
Grazie mille ancora per la pazienza! ;)
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
gio 13 gen 2011 - 14:54
>il problema è che il calcolo lo devo fare per ogni giorno e quel while è indispensabile!
se il calcolo è solo quello della select non sembra esserlo, ma non conoscendo bene la situazione reale non voglio farti cambiare approccio per forza
Quindi, ok..
>ho provato in questo modo:
>ho eliminato la tabella temporanea e lasciato il while, ora mi
>crea tramite il Fill del mysqldataadapter un dataset con un casino
>di tabelle, una per ogni giorno, e mi faccio le sum lato codice...
>solo che ora è lento lato codice! perchè per ogni datatable contenuta
>nel dataset devo fare le somme, non c'è un metodo per renderlo + veloce?
eheh, fare tutto in una query fin dall'inizio, ma se fai il while, sei legato a questo.
>magari al posto di restituirmi un dataset con n tabelle, un merge
>di tutte le tabelle? cosi le somme le faccio sempre sulla stessa?
eh, quella è l'utilizzo della temp.
>a rigor di logica in questo modo dovrebbe essere + veloce piuttosto che scorrersi tutte quelle tabelle no?
Sinceramente, facendo le operazioni cicliche e non set based, non riuscirai ad ottimizzare più di tanto.
>Grazie mille ancora per la pazienza! ;)
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
simonep
Profilo
| Newbie
12
messaggi | Data Invio:
gio 13 gen 2011 - 15:01
>>il problema è che il calcolo lo devo fare per ogni giorno e quel while è indispensabile!
>se il calcolo è solo quello della select non sembra esserlo,
>ma non conoscendo bene la situazione reale non voglio farti cambiare
>approccio per forza
>Quindi, ok..
>
>>ho provato in questo modo:
>>ho eliminato la tabella temporanea e lasciato il while, ora mi
>>crea tramite il Fill del mysqldataadapter un dataset con un casino
>>di tabelle, una per ogni giorno, e mi faccio le sum lato codice...
>>solo che ora è lento lato codice! perchè per ogni datatable contenuta
>>nel dataset devo fare le somme, non c'è un metodo per renderlo + veloce?
>eheh, fare tutto in una query fin dall'inizio, ma se fai il while,
>sei legato a questo.
>
>>magari al posto di restituirmi un dataset con n tabelle, un merge
>>di tutte le tabelle? cosi le somme le faccio sempre sulla stessa?
>eh, quella è l'utilizzo della temp.
>
>>a rigor di logica in questo modo dovrebbe essere + veloce piuttosto che scorrersi tutte quelle tabelle no?
>Sinceramente, facendo le operazioni cicliche e non set based,
>non riuscirai ad ottimizzare più di tanto.
>
>>Grazie mille ancora per la pazienza! ;)
>di nulla!
>--
>
:(
considerando che si tratta di statistiche penso che le faro' partire come dei processi asincroni, e quando finiscono lo faccio scrivere in un file i risultati dell'elaborazione :( cosi poi sono ricercabili in un repository di statistiche! non vedo altra soluzione! :(
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
gio 13 gen 2011 - 15:04
>considerando che si tratta di statistiche penso che le faro'
>partire come dei processi asincroni, e quando finiscono lo faccio
>scrivere in un file i risultati dell'elaborazione :( cosi poi
>sono ricercabili in un repository di statistiche! non vedo altra
>soluzione! :(
io, veramente, mi concentrerei nel fare tutto in uno statement, ragionando bene sul calcolo.
Prova a farci una pensata.. Facci sapere come va eh!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Torna su
Stanze Forum
Elenco Threads
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 !