[VB.NET] Consigli su miglioramento velocità lettura e caricamento dati...

martedì 05 aprile 2011 - 17.53
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows XP  |  Visual Studio Express  |  SQL Server Express

plaguebreath Profilo | Junior Member

Salve a tutti, ho un server sql express 2008 r2 che gira su un PC core 2 con 4gb e mi fa da server SQL. Ho un programma che utilizza i dati presenti in uno dei database nella macchina e li carica in un dataset con diciamo 20 tabelle, 3 di esse hanno circa 2000 row l'una mentre le altre sono delle sottotabelle collegate a una delle 3 mediante relazione 1-molti mediamente andiamo intorno alle 200 row ogni tabella.
All'avvio del form lancio una sub che mi carica e binda il dataset a svariati controlli nel form principale. L'operazione di caricamento dati sui pc più recenti ci impiega diciamo 2 secondi mentre su computer collegati ad un altra sede ma tramite connettività 10mb ci impiega anche 7 o 9 secondi la stessa procedura e tutto mi si freeza aspettando il termine di detta operazione. C'è qualche procedura per ottimizzare il tempo di caricamento dei dati nel dataset ?
Sicuramente sbaglio io ma ad esempio ogni volta che l'operatore esegue un update dei dati al termine del salvataggio lancio un refresh del dataset per avere i dati più aggiornati (ad esempio elaborati magari anche da altre persone in modo da gestire la concorrenza ottimistica) e visto che le procedure di update le eseguo tramite stored procedure parametrizzate mi domandato se invece di eseguire un refresh del dataset non fosse più logico rieseguire un select nella stored procedure dopo l'operazione (9 secondi ogni volta è una tragedia ..) ?
Un esempio di stored che uso attualmente è questa:

CREATE PROCEDURE [dbo].[spUpdateCommFiles]
(
@pr_IdFiles INT,
@pr_IdVer int,
@pr_NomeFiles varchar(255),
@pr_LinkFiles varchar(1024),
@pr_DataImport datetime,
@pr_NotaFiles varchar (255),

@Original_pr_IdFiles int,

@original_ts timestamp,
@ts timestamp output
)
AS
begin
SET NOCOUNT OFF;
UPDATE [tVerPrevCommFiles] SET
[pr_IdVer]= @pr_IdVer,
[pr_NomeFiles] = @pr_NomeFiles,
[pr_LinkFiles] = @pr_LinkFiles,
[pr_DataImport] = @pr_DataImport,
[pr_NotaFiles]=@pr_NotaFiles

WHERE (([pr_IdFiles] = @Original_pr_IdFiles) AND ([ts] = @Original_ts));
IF @@rowcount <> 0
SELECT @ts = ts FROM tVerPrevCommFiles WHERE (pr_IdFiles = @pr_IdFiles)
END

in essa prelevo come parametro di output solo il timestamp ma dovrei mettere anche tutti gli altri parametri come parametri di output ???
Spero di essere stato chiaro e spero di ricevere qualche consiglio (non di cambiare rete perchè non è fattibile al momento e poi non è solo quello, volevo capire come fare per ottimizzare i tempi)
Ho letto circa il threading ma non ne ho capito molto sinceramente e per un progetto di tale entità non so se vale la pena complicarsi la vita così tanto.
Grazie a tutti !

niccord Profilo | Newbie

Ciao,
non conosco nessun modo per velocizzare il caricamento dei dataset.

Potresti migliorare l'accesso ai dati tramite l'aggiunta di indici alle tabelle interrogate e scrivendo query che facciano lavorare meno il db.
Se non l'hai già fatto, prova a utilizzare gli strumenti per l'ottimizzazione guidata al database.

Così, intanto, invece di 9 secondi ce ne metterà 5..che non è molto, ma è un inizio.

plaguebreath Profilo | Junior Member

Grazie per la risposta, non è un problema di database sicuramente, non tratto dati pesanti con campi byte o immagini, e 2000 righe non mi sembrano valori esorbitanti, ho letto che query di select per 27000 riga ci stanno tipo 1 secondo. Secondo il mio modesto parere ci sono trucchi per migliorare il caricamento del dataset ma purtroppo non conoscendoli domando qui ;)
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