Velocità database SQL Express 2008 R2

martedì 30 settembre 2014 - 09.15
Tag Elenco Tags  C#  |  .NET 4.0  |  Visual Studio 2010  |  SQL Server Express

hydra Profilo | Junior Member

Buongiorno a tutti, vorrei chiedere un parere a qualcuno di esperto.
Mi capita di utilizzare dei database nelle applicazioni che sviluppo e normalmente utilizzo Linq con SQL Express, dato che non sono database complessi ma si occupano generalmente di raccolta dati su una sola tabella.
Capita però che quando il database inizia a contenere qualche migliaio di righe l'applicazione rallenti in modo vistoso (eppure la dimensione fisica del database non è eccessiva, se arriviamo a 30MB è tanto). Mi sapete dire se c'è qualche accorgimento che potrei prendere?
Ringrazio tutti in anticipo e se avete bisogno di maggiori informazioni chiedete pure.

alx_81 Profilo | Guru

>Buongiorno a tutti, vorrei chiedere un parere a qualcuno di esperto.
ciao

>Mi sapete dire se c'è qualche accorgimento che potrei prendere?
dovresti innanzitutto verificare cosa rallenta. Che tipo di chiamate fai ad esempio, e catalogarle con i tempi impiegati reali.
Una volta localizzate le query "lente" allora c'è da capire come hai fatto il design, se hai indici, se servono, ecc..
ma prima devi capire cosa fa rallentare.
Potrebbe anche essere un ciclo relativo a n mila righe, indipendente dal database..
Considera comunque che Express non usa più di un processore.

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

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

hydra Profilo | Junior Member

Ciao e grazie per la risposta.
Queste applicazioni si occupano tra le altre cose di acquisire dei dati di processo, vale a dire che ogni tot secondi acquisiscono dei dati e li salvano nel database. Come ti dicevo c'è una sola tabella, quindi non ci sono relazioni con altre tabelle e ogni elemento ha una PK che ho impostato del tipo intero (cioè è un numero progressivo); all'inizio calcolo il numero del primo ID libero e poi quando faccio l'inserimento dei dati l'ID viene automaticamente incrementato (in modo da non dover andare ogni volta a calcolare il primo intero libero scorrendo tutti gli indici già inseriti).
Essendo che devo andare ad acquisire un tot di dati, ripetuti per una serie di dispositivi, ho pensato di non inserire i dati appena li acquisisco ma attualmente li salvo in una lista e li scrivo nel database alla fine dell'acquisizione di ogni dispositivo (spero sia chiaro come l'ho spiegato), quindi vado ad eseguire una InsertAllOnSubmit e quindi una SubmitChanges.
Queste sono le operazioni che faccio. Tra le altre cose ho fatto anche un'altra prova: siccome mi serviva che il cliente mi girasse il database, per fargli una cosa veloce senza che vada a smanettare con le connessioni ho fatto in modo di esportare il database in un file csv e poi io me lo importo leggendo tutti i dati dal csv, formattandoli in una lista e poi inserendo la lista intera; quello che non mi torna è che andando ad acquisire ad esempio 30000 righe ed inserendole in blocco direttamente in una tabella vuota non mi pare che sia così lento (ovviamente non è immediato ma non è neanche così lento), eppure i metodi che vado a richiamare sono gli stessi identici che uso durante il processo. Boh.

alx_81 Profilo | Guru

>Queste applicazioni si occupano tra le altre cose di acquisire
>dei dati di processo, vale a dire che ogni tot secondi acquisiscono
>dei dati e li salvano nel database.
Ok quindi c'è un "polling" di un servizio che continua a leggere/scrivere.
Prime domande:
- il processo fa INSERT solamente o anche UPDATE?
- ci sono letture prima delle scritture (tipo dei controlli)?

>Come ti dicevo c'è una sola tabella, quindi non ci sono relazioni con altre tabelle e ogni
>elemento ha una PK che ho impostato del tipo intero (cioè è un numero progressivo);
>all'inizio calcolo il numero del primo ID
>libero e poi quando faccio l'inserimento dei dati l'ID viene
>automaticamente incrementato (in modo da non dover andare ogni
>volta a calcolare il primo intero libero scorrendo tutti gli indici già inseriti).
ma come lo fai questo calcolo? fai tu +1? o è un'identità?

>Essendo che devo andare ad acquisire un tot di dati, ripetuti
>per una serie di dispositivi, ho pensato di non inserire i dati
>appena li acquisisco ma attualmente li salvo in una lista e li
>scrivo nel database alla fine dell'acquisizione di ogni dispositivo
>(spero sia chiaro come l'ho spiegato), quindi vado ad eseguire
>una InsertAllOnSubmit e quindi una SubmitChanges.
cerca di capire come viene salvato questo set. Row by row? in batch da x righe?

>Queste sono le operazioni che faccio. Tra le altre cose ho fatto
>anche un'altra prova: siccome mi serviva che il cliente mi girasse
>il database, per fargli una cosa veloce senza che vada a smanettare
>con le connessioni ho fatto in modo di esportare il database
>in un file csv e poi io me lo importo leggendo tutti i dati dal
>csv, formattandoli in una lista e poi inserendo la lista intera;
>quello che non mi torna è che andando ad acquisire ad esempio
>30000 righe ed inserendole in blocco direttamente in una tabella
>vuota non mi pare che sia così lento (ovviamente non è immediato
>ma non è neanche così lento), eppure i metodi che vado a richiamare
>sono gli stessi identici che uso durante il processo. Boh.
Eh devi andare in debug molto profondamente.. Purtroppo senza avere il tuo processo davanti è dura.
Andiamo per passo, per ora rispondi alle domande che ti ho fatto e vediamo se ci saltiamo fuori.
ciao
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5