Tabelle SQL molto grandi e lente

martedì 03 luglio 2012 - 16.10
Tag Elenco Tags  C#  |  VB.NET  |  Visual Studio 2010  |  SQL Server 2008 R2

blackspidy14 Profilo | Junior Member

Ciao a tutti ho scaricato una tabella dei comuni italiani e quando cerco di caricarla anche in semplice datagrid, il form ci impiaga molti secondi (quasi un minuto) prima di avviarsi.

Dim objConnection As New SqlConnection(My.Settings.AISConnectionString)

Dim objDataAdapter As SqlDataAdapter Dim objDataSet As DataSet Dim objDataView As DataView Dim objOccurencyManager As CurrencyManager Dim myBindingSource As New BindingSource() Private Sub fill() Dim sqlString As String = '"SELECT * FROM Comune" objDataAdapter = New SqlDataAdapter(sqlString, objConnection) objDataSet = New DataSet() objDataAdapter.Fill(objDataSet, "comuni") objDataView = New DataView(objDataSet.Tables("comuni")) myBindingSource.DataSource = objDataSet.Tables("comuni") objOccurencyManager = CType(Me.BindingContext(myBindingSource), CurrencyManager) dgvComuni.DataSource = myBindingSource End Sub

Posso velocizzare l'operazioni?

StefanoRicci Profilo | Junior Member

non puoi filtrarla per regione, oppure caricarla a blocchi di n elementi?
--------------------------------------

IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Professional Edition

alx_81 Profilo | Guru

>Ciao a tutti ho scaricato una tabella dei comuni italiani e quando
>cerco di caricarla anche in semplice datagrid, il form ci impiaga
>molti secondi (quasi un minuto) prima di avviarsi.
>Posso velocizzare l'operazioni?
Ma di quante righe stiamo parlando? E come la leggi, nel senso, quale statement usi?
Di solito per operazioni di questo tipo è meglio cambiare approccio:
- caricarle tutte in memoria al primo avvio e tenere su server i dati senza accedere a database, visto che di solito tabelle come quelle sono read only
- caricare in asincrono, per fare in modo di non dover aspettare il load di quella entità prima di rendere utilizzabile l'applicazione
- usare degli indici, che potrebbero nel tuo caso mancare

ciao

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

blackspidy14 Profilo | Junior Member

>Ma di quante righe stiamo parlando? E come la leggi, nel senso,
>quale statement usi?

Le righe sono 8094 e sono un in db sql server 2008 r2

>Di solito per operazioni di questo tipo è meglio cambiare approccio:
>- caricarle tutte in memoria al primo avvio e tenere su server
>i dati senza accedere a database, visto che di solito tabelle
>come quelle sono read only
>- caricare in asincrono, per fare in modo di non dover aspettare
>il load di quella entità prima di rendere utilizzabile l'applicazione
>- usare degli indici, che potrebbero nel tuo caso mancare

esatto le tabelle sono read-only. cosa intendi con caricarle in asincrono ?

alx_81 Profilo | Guru

>Le righe sono 8094 e sono un in db sql server 2008 r2
ovvero pochissime. C'è da capire se è la query lenta davvero o il render della tua pagina. Sai quanto impiega veramente la query?

>in asincrono ?
prima di arrivare a questo, che è lato applicazione.. mi potresti dire come fai a tornare i dati? la query?
perchè secondo me possiamo super ottimizzare qui.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

blackspidy14 Profilo | Junior Member

e io che pensavo fossero tante

Eseguo una semplice query - SELECT * FROM Comuni

Il codice che uso l'ho scritto nel primo post.


alx_81 Profilo | Guru

>e io che pensavo fossero tante
decisamente no.. sono tante da visualizzare, sono pochissime per un RDBMS (ma anche questo poi dipende dal server su cui hai installato l'sql).

>Eseguo una semplice query - SELECT * FROM Comuni
Evita il carattere * sempre. Torna SOLO i campi che ti servono. Ad esempio, il codice e la descrizione, niente altro. Anche se i campi sono solo quelli, indicali sempre ed evita *.

>Il codice che uso l'ho scritto nel primo post.
Io eviterei l'utilizzo dei dataset, cercando di usare il datareader che sprecano molta meno memoria.
comunque, c'è da capire dove è la perdita di tempo. Dove devi aspettare tanto facendo debug? Nella fill? o altrove, tipo nel render della pagina?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

blackspidy14 Profilo | Junior Member

la sub fill() è nell'evento load di un form ed è lì che ci mette molto sembra quasi che si blocchi e poi dopo circa 30'' secondi parte e mi permette di consultare il datagrid.

cmq adesso provo a riscrivere il codice ed a usare un datareader come mi hai consigliato.

blackspidy14 Profilo | Junior Member

ho risolto così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

il tutto è stato messo nell'evento load di un form. Adesso carica il tutto in poco meno 4/5 secondi. Penso posso essere accettabile.
Se avete delle migliorie da proporre sono tutto orecchie

alx_81 Profilo | Guru

>il tutto è stato messo nell'evento load di un form. Adesso carica
>il tutto in poco meno 4/5 secondi. Penso posso essere accettabile.
non capisco perchè ci deve mettere così tanto meno. La query ha un prodotto cartesiano in più per via della join, solo che non usi *.
Faccio un po' fatica a capire che cosa possa farlo rallentare così. O il resto delle colonne è pesantissimo o è il binding source, o proprio non saprei a cosa attribuirlo.

>Se avete delle migliorie da proporre sono tutto orecchie
Sì, non usare i data set , sono uno spreco di memoria

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

blackspidy14 Profilo | Junior Member

>non capisco perchè ci deve mettere così tanto meno. La query
>ha un prodotto cartesiano in più per via della join, solo che
>non usi *.
quindi è un tempo accettabile secondo te? io pensavo fosse un tempo lunghissimo.

>Sì, non usare i data set , sono uno spreco di memoria
ho provato con il datareader ma ho un problema io devo usare una colonna di questa tabella come items di una combobox e all'evento selectedindexchange devo compilare altre due textbox con i dati di altre due colonne della medesima tabella.

in pratica ho una tabella con i COMUNI - PROVINCIE -CAP , scegliendo nella combobox il comune automaticamente si completano le altre due textbox con cap e provincia. e tutto questo con il dataset è molto semplice mentre con il datareader mi sono fermato all'aggiunta di degli items nella combobox.

alx_81 Profilo | Guru

>quindi è un tempo accettabile secondo te? io pensavo fosse un
>tempo lunghissimo.
per me già più i un secondo è tantissimo sinceramente.

>ho provato con il datareader ma ho un problema io devo usare
>una colonna di questa tabella come items di una combobox e all'evento
>selectedindexchange devo compilare altre due textbox con i dati
>di altre due colonne della medesima tabella.
col datareader puoi usare un tuo oggetto e popolarlo, poi usare il tuo oggettino (molto più semplice del dataset) per gestire poi le casistiche delle combobox.
Comunque, se hai già scritto tutto con il DataSet lascialo pure, è solo un consiglio per il futuro.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

blackspidy14 Profilo | Junior Member


>Comunque, se hai già scritto tutto con il DataSet lascialo purePe,
>è solo un consiglio per il futuro

posso sempre riscrivere qualche riga di codice sono sempre aperto a nuove idee, anche perché sono molto auto-didatta in materia di programmazione quindi ogni consiglio è sempre ben accetto. Cmq provo a riscrivere il tutto utilizzando il datareader e poi ti faccio sapere se le tempistiche si riducono
Per ora non posso fare altro ke ringraziarti di cuore!
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5