Performance a zero

mercoledì 11 maggio 2011 - 19.15

lordwaizard Profilo | Senior Member

Scusate per la domanda da neofita, ho sviluppato svariate query su un sito asp.net chiama un db mssql express.
Tutto funziona correttamente, adesso il db, dopo quasi un anno di attività, incomcia a perdere i colpi.
In sintesi si rallanta anche se le query sono banalissime. (e i dati non sono miglioni di righe)

Premesso che collegandomi con management mi dice che :
USATO 29,44 MB
DISPONBILE 0,50MB

Quindi le domande sono:
1) Ma il limite del db non era 1gb?
2) Come faccio a rilevare il peso di un operazione
3) E' possibile monitorare il carico dei db, per capire se c'è un eccessivo utilizzo da parte di altri utenti sempre sulla stessa macchina ma su database diversi con medesima istanza?

Vi ringrazio in anticipo.
Ciao
Davide

Brainkiller Profilo | Guru

>In sintesi si rallanta anche se le query sono banalissime. (e
>i dati non sono miglioni di righe)

Forse il problema è altrove.

>1) Ma il limite del db non era 1gb?

MSDE aveva 2 gb di limite, Express 2005 a 4 gb, e la 2008 R2 mi pare 10 Gb
Beh tu sei a 30 mega... non l'hai ancora raggiunto

>2) Come faccio a rilevare il peso di un operazione
>3) E' possibile monitorare il carico dei db, per capire se c'è
>un eccessivo utilizzo da parte di altri utenti sempre sulla stessa
>macchina ma su database diversi con medesima istanza?

Ci sono vari meccanismi, ma Lorenzo sarà più preciso di me.
Puoi visualizzare il Query Plan delle query, ma non so se il SQL Management Studio Express ce l'ha, in ogni caso capirne l'output non è alla portata di tutti.
Si possono usare i Query Optimizer che ottimizzano le query.
Io uso il SQL Query Profiler, un software che si aggancia al DB e monitora tutte le query e altro che passano. Non mi pare ci sia in SQL Express ma puoi usarne uno open:
http://sites.google.com/site/sqlprofiler/
Se hai un problema di lentezza, io guardo sempre la colonna Duration (ossia quanti millisecondi ci mette la query ad essere eseguita).

Non è detto che il problema sia delle query in sè, magari mancano gli indici sulle tue tabelle o bisogna ricostruirli perchè sono deframmentati (in ogni caso dal query profiler te ne accorgi perchè se ci sono tante Reads significa che ci sono tante letture e ciò può richiedere più tempo).
Vedendo la dimensione del tuo DB pochissimo 30 mega... forse mancano degli indici.

Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

alx_81 Profilo | Guru

ciao
>Premesso che collegandomi con management mi dice che :
>USATO 29,44 MB
>DISPONBILE 0,50MB
se sommi USATO + DISPONIBILE otterrai la dimensione del file di dati. Di default, un database e' impostato in AUTOGROWTH, ovvero in crescita automatica e la crescita, se raggiungo il limite della dimensione del file impostato, e' pari a quanto impostato nel parametro file growth, che se non ricordo male e' il 10% della dimensione totale. Se il database non e' in autogrowth, riceverai eccezioni nel caso in cui cerchi di inserire o modificare dati nel database (operazioni che fanno crescere il file di dati).

>Quindi le domande sono:
>1) Ma il limite del db non era 1gb?
1GB e' la RAM occupabile, il database puo' contenere fino a 10GB (4GB con 2005, 10GB con 2008)

>2) Come faccio a rilevare il peso di un operazione
eh.. questa e' veramente impegnativa. Serve molta esperienza nel tuning delle query, ma la prima cosa e' partire capendo come lavora una query al suo interno: http://www.sql.co.il/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf
Quando sei allineato col poster nel link precedente, dovrai controllare il piano di esecuzione delle tue query, per capire dove hai i rallentamenti. Insieme ad esso, disegnare indici che possano esserti di aiuto e che sicuramente, migliorano le tue ricerche. E qui si apre il discorso indici, infinito ..
Inoltre dovrai ricordare sempre che anche chi cerca o chi usa le tue query va istruito ed "educato". Con questo intendo, NO ai filtri su tutta la tabella, ridurre SQL dinamici, capire come una query puo' essere riutilizzata, capire i lock per ridurre le contese delle risorse, fare transazioni piccole, usare temporanee e subquery, ecc.. ci sarebbero corsi interi su queste considerazioni.
Purtroppo con l'express non hai a disposizione il Tuning Advisor, ma sono certo, che studiano un po' gli indici ed il poster di cui sopra, riuscirai a migliorare le query in maniera veramente sensibile. Non e' facile, ma e' un lavoro che da i suoi risultati.

>3) E' possibile monitorare il carico dei db, per capire se c'è
>un eccessivo utilizzo da parte di altri utenti sempre sulla stessa
>macchina ma su database diversi con medesima istanza?
Con il SQL Server Profiler, ma con express non e' fornito. Prova questo tool open source: http://www.marcobellinaso.com/blog-ita/post/Un-Profiler-per-SQL-Server-2005-Express-Edition.aspx

>Vi ringrazio in anticipo.
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

lordwaizard Profilo | Senior Member

Vi ringrazio per le risposte, ora ho provato il tool.

Due domande:
1) Ho degli script da 44 e alcuni da 3000 di durata, presumo che quelli da 3000 siano da ottimizzare ma non mi stampa il comando, scrive solo SELECT, come faccio a capire dove ho sbagliato?
2) Non riesco a capire se sono gli script o il carico, credo entrambe le cose perchè questa mattina ci metteva 20 sec e ieri sera 44.

Il programma seleziona semplicemente una tabella di orari di presenza su 80.000 righe (avrà solo 5/7 colonne), utilizza semplicemente WHERE per filtrare la persona e la data. Non riesco a capire come posso semplificare o ottimizzare un operazione così semplice.

Grazie
Davide

Brainkiller Profilo | Guru

>Il programma seleziona semplicemente una tabella di orari di
>presenza su 80.000 righe (avrà solo 5/7 colonne), utilizza semplicemente
>WHERE per filtrare la persona e la data. Non riesco a capire
>come posso semplificare o ottimizzare un operazione così semplice.

Hai creato degli indici sulla colonna persona e data, cioè quelle incluse nel WHERE ?

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

alx_81 Profilo | Guru

>Il programma seleziona semplicemente una tabella di orari di
>presenza su 80.000 righe (avrà solo 5/7 colonne), utilizza semplicemente
>WHERE per filtrare la persona e la data. Non riesco a capire
>come posso semplificare o ottimizzare un operazione così semplice.
secondo me serve un'analisi molto più approfondita, tipo, vedere almeno la query che lanci, completa, per poter trarre conclusioni.
Anche se potrebbe non essere sufficiente..
--
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

lordwaizard Profilo | Senior Member

Si gli indici c'erano già (id incrementale 1), ma come faccio a vedere la riga sql completa dall'analizzatore sql?

Grazie
Davide

lbenaglia Profilo | Guru

>Si gli indici c'erano già (id incrementale 1), ma come faccio
>a vedere la riga sql completa dall'analizzatore sql?

Ciao Davide,

"id incrementale 1" si riferisce alla proprietà IDENTITY di una colonna numerica e non ha niente a che vedere con gli indici.
Per verificare se una tabella ha indici utilizza la stored procedure sp_helpindex:
http://msdn.microsoft.com/it-it/library/ms188771.aspx

Per ricostruirli utilizza il comando ALTER INDEX...REBUILD:
http://msdn.microsoft.com/it-it/library/ms188388.aspx

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
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