8 messaggi dal 06 luglio 2005
Ciao a tutti,
ho un DB SQL da 45 GB, su di un server da Itanium2 con sopra 8 GB di ram, il
cliente si e' lamentato del fatto che le query eseguite sono molto lento e
molte volte non vanno a buon fine.
Premetto che il cliente utilizza anche SharePoint SQL con un peso gravoso sul DB perche' infatti si toccano punte di 16 GB per i dati di detto applicativo.

A primo occhio vedo che la memoria ram usata e' intorno ai 8.5 GB, quindi il
server ha esaurito la memoria e sta swappando, probabilmente chi lo ha montato si e' dimenticato di mettere il limite della memoria per SQL, e gia' questo non e' un buon sintomo.

Dopo aver utilizzato SQL Profiler ho verificato che il DB su alcune
query che interessano dati di SharePoint SQL ha un delay di qualche min. e in modo randomico falliscono.

A questo punto le uniche cose che posso fare sono:
1. Deframmentare gli indici associata alle statistiche non aggiornate.
2. Comprimere il DB.
3. Limitare l'uso della memoria da parte del DB.

Avete qualche suggerimento da darmi in base a queste considerazioni?
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
spyto wrote:
Ciao a tutti,
ho un DB SQL da 45 GB, su di un server da Itanium2 con sopra 8 GB di ram, il
cliente si e' lamentato del fatto che le query eseguite sono molto lento e molte volte non vanno a buon fine.
Premetto che il cliente utilizza anche SharePoint SQL con un peso gravoso sul DB perche' infatti si toccano punte di 16 GB per i dati di detto applicativo.

A primo occhio vedo che la memoria ram usata e' intorno ai 8.5 GB, quindi il
server ha esaurito la memoria e sta swappando, probabilmente chi lo ha montato si e' dimenticato di mettere il limite della memoria per SQL, e gia' questo non e' un buon sintomo.

Dopo aver utilizzato SQL Profiler ho verificato che il DB su alcune query che interessano dati di SharePoint SQL ha un delay di qualche min. e in modo randomico falliscono.

A questo punto le uniche cose che posso fare sono:
1. Deframmentare gli indici associata alle statistiche non aggiornate.

ok.. magari dovreste anche vedere se gli indici sono correttamente utilizzati dalle query che state eseguendo o se esistono molti scan completi che sarebbero potenzialmente "migliorabili" con l'aggiunta di indici che consentano prestazioni migliori..

2. Comprimere il DB.
in che senso?
la compressione non ha tendenzialmente senso, visto che "tendenzialmente" il db ha una dimensione dettata dalla quantita' di dati in esso presenti.. ovviamente ci possono essere dei miglioramente in termini di deframmentazione fisica delle pagine, cosa che comporta una migliore consequenzialita' delle pagine, oltre eventualmente ad avere un "miglior" rapporto di pagina/numero righe e quindi ottenere letture con recupero di un minor numero di pagine..

3. Limitare l'uso della memoria da parte del DB.
questo lo hai gia' indicato anche in microsoft.public.it.sql... dici anche, infatti:
A primo occhio vedo che la memoria ram usata e' intorno ai 8.5 GB, quindi il
server ha esaurito la memoria e sta swappando, probabilmente chi lo ha montato si e' dimenticato di mettere il limite della memoria per SQL, e gia' questo non e' un buon sintomo.
ma se limiti la memoria del database engine, tendenzialmente, le performance diminuiscono, visto che necessariamente l'engine dovra' scaricare pagine di dati dalla propria cache come anche piani di esecuzione eventualmente riutilizzabili e via dicendo.. non capisco bene cosa pensi di ottenere limitando l'utilizzo della cache da parte di SQL Server..
che non sia un buon sintomo il fatto che il server stia swappando puo' anche essere, ma sicuramente non lo e' il fatto che "..chi lo ha montato si e' dimenticato di mettere il limite della memoria per SQL"..
sinceramente preferirei eventualmente liberare il server da altri servizi se presenti, che chiaramente aumentano la concorrenzialita' per le "limitate" risorse disponibili..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
8 messaggi dal 06 luglio 2005

la compressione non ha tendenzialmente senso, visto che "tendenzialmente" il db ha una dimensione dettata dalla quantita' di dati in esso presenti.. ovviamente ci possono essere dei miglioramente in termini di deframmentazione fisica delle pagine, cosa che comporta una migliore consequenzialita' delle pagine, oltre eventualmente ad avere un "miglior" rapporto di pagina/numero righe e quindi ottenere letture con recupero di un minor numero di pagine..

Per quanto concerne la compressione hai perfettamente ragione non ha nessuna utilita' visto che rallenterebbe il tutto.


ma se limiti la memoria del database engine, tendenzialmente, le performance diminuiscono, visto che necessariamente l'engine dovra' scaricare pagine di dati dalla propria cache come anche piani di esecuzione eventualmente riutilizzabili e via dicendo.. non capisco bene cosa pensi di ottenere limitando l'utilizzo della cache da parte di SQL Server..
che non sia un buon sintomo il fatto che il server stia swappando puo' anche essere, ma sicuramente non lo e' il fatto che "..chi lo ha montato si e' dimenticato di mettere il limite della memoria per SQL"..
sinceramente preferirei eventualmente liberare il server da altri servizi se presenti, che chiaramente aumentano la concorrenzialita' per le "limitate" risorse disponibili..
saluti

Si valutando cio che dici sto verificando dei servizi che potrebbero essere buttati giu' per non far swappare la macchina in continuazione.

Questa mattina ho controllato bene il DB e mi trovo difronte a dei DB da 8-10 GB senza che ci sia nessun indice e vi sono delle query controllate tramite SQL Profiler che per ricavare determinati dati ci mettono 30-40 sec.

La domanda che vorrei porti per poter dare a chi di dovere tutto il lavoro da fare e quanto si puo guadagnare in termini di tempo ristrutturando il DB e mettendo gli indici? (Scusa il tipo di domanda ma ho sempre lavorato mettendo gli indici e non mi sono mai posto il problema).
1.976 messaggi dal 27 luglio 2005
Contributi
salve,

Per quanto concerne la compressione hai perfettamente ragione non ha nessuna utilita' visto che rallenterebbe il tutto.

non rallenterebbe alcunche'... solo non potrebbe avvenire, se il database e' gia' stato "correttamente" riorganizzato..


Questa mattina ho controllato bene il DB e mi trovo difronte a dei DB da 8-10 GB senza che ci sia nessun indice e vi sono delle query controllate tramite SQL Profiler che per ricavare determinati dati ci mettono 30-40 sec.

:|

La domanda che vorrei porti per poter dare a chi di dovere tutto il lavoro da fare e quanto si puo guadagnare in termini di tempo ristrutturando il DB e mettendo gli indici? (Scusa il tipo di domanda ma ho sempre lavorato mettendo gli indici e non mi sono mai posto il problema).
al di la' dei secondi (e sicuramente molti) che puoi ottenere di miglioramento ma che ovviamente non ti so indicare, la "ristrutturazione" del database, viste le dimensioni, e' d'obbligo.. sapere poi quali e quanti indici inserire e' poi altra cosa.. andrebbe fatta una valutazione di workloads il piu' attendibile possibile... SQL Server, oltre al Profiler, dispone di alcuni strumenti che potrebbero aiutarti come l'Index Tuning Wizard o Database Engine Tuning Advisor, a seconda delle versioni, che raccogliendo un workload "standard" di una giornata potrebbe gia' dare delle buone indicazioni.. ovviamente poi bisogna in effetti controllare eventuali decadimenti prestazionali nelle altre operazioni DML se le funzionalita' sono "anche o specialmente" OLTP, ed eventualmente trovare i compromessi.... sicuramente e' un percorso anche a "tentativi", ma sicuramente e' da fare.. saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
8 messaggi dal 06 luglio 2005
al di la' dei secondi (e sicuramente molti) che puoi ottenere di miglioramento ma che ovviamente non ti so indicare, la "ristrutturazione" del database, viste le dimensioni, e' d'obbligo.. sapere poi quali e quanti indici inserire e' poi altra cosa.. andrebbe fatta una valutazione di workloads il piu' attendibile possibile... SQL Server, oltre al Profiler, dispone di alcuni strumenti che potrebbero aiutarti come l'Index Tuning Wizard o Database Engine Tuning Advisor, a seconda delle versioni, che raccogliendo un workload "standard" di una giornata potrebbe gia' dare delle buone indicazioni.. ovviamente poi bisogna in effetti controllare eventuali decadimenti prestazionali nelle altre operazioni DML se le funzionalita' sono "anche o specialmente" OLTP, ed eventualmente trovare i compromessi.... sicuramente e' un percorso anche a "tentativi", ma sicuramente e' da fare.. saluti


Sono riuscito tramite il Profiler a individuare una query che viene ripetuta quasi ogni click che si effettua ma che porta il processo ad avere un delay di 50 sec. In questo modo si arriva ad un latenza totale di diversi minuti perche se l'utente per inserire i dati nel gestionale la query viene processata sempre.
Quello che posso fare allo stato attuale e' di snellire le tabelle interessate dalla query, se non dovesse sortire nessun effetto inzio ad usare l'Index Tuning Wizard o Database Engine Tuning Advisor e poi passo tutto ai tecnici Microsoft che sono loro che hanno montato il tutto.

Alex.
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
spyto wrote:

Sono riuscito tramite il Profiler a individuare una query che viene ripetuta quasi ogni click che si effettua ma che porta il processo ad avere un delay di 50 sec. In questo modo si arriva ad un latenza totale di diversi minuti perche se l'utente per inserire i dati nel gestionale la query viene processata sempre.
questo non e' proprio "italiano"  ... prova a riformulare che magari diventa piu' comprensibile
ad ogni modo questa query e' sicuramente un ottimo candidato per implementare un set di indici adeguato..

Quello che posso fare allo stato attuale e' di snellire le tabelle interessate dalla query,
cosa intendi per "snellire"? vorrei supporre che metterai adeguati indici e non che togli colonne o righe di dati alle tabelle
eventualmente puoi verificare che non ci siano delle
SELECT *
nel corpo delle selezioni se delle semplici
SELECT col1, col2
e basta
possono essere piu' che sufficienti... in casi simili anche la creazione di indici di copertura, se non disturbano dal lato CRUD, sono molto indicati.. ma ovviamente non se ne puo' parlare se non "a caso" oppure con la macchina sotto..

se non dovesse sortire nessun effetto inzio
ad usare l'Index Tuning Wizard o Database Engine Tuning Advisor e poi passo tutto ai tecnici Microsoft che sono loro che hanno montato il tutto.
cosa hanno montato? solo il database? mi pare strano  personalmente ti consiglio comunque di guardarci molto bene, magari anche con loro, ma assistere comunque..

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
8 messaggi dal 06 luglio 2005
cosa intendi per "snellire"? vorrei supporre che metterai adeguati indici e non che togli colonne o righe di dati alle tabelle
eventualmente puoi verificare che non ci siano delle
SELECT *
nel corpo delle selezioni se delle semplici
SELECT col1, col2
e basta
possono essere piu' che sufficienti... in casi simili anche la creazione di indici di copertura, se non disturbano dal lato CRUD, sono molto indicati.. ma ovviamente non se ne puo' parlare se non "a caso" oppure con la macchina sotto..

Hai ragione ho scritto veramente da cane, ma dovevo vedere diverse cose e mi sono distratto ;)
In pratica quello che si potrebbe fare come primo step per sbloccare la situazione e pulire il DB visto che vi sono molti record non cancellati, ovvero loro inseriscono dati, li processano e poi li storicizzano. Ma nel momento che il dato viene passato allo storico l'originale rimane nella tabella principale e si creano record inutili.
Altra cosa vi sono query con SELECT *, ma li dipende dall'applicativo, vediamo se riesco a risalire a chi l'ha fatto per chiedere spiegazioni in merito.

cosa hanno montato? solo il database? mi pare strano  personalmente ti consiglio comunque di guardarci molto bene, magari anche con loro, ma assistere comunque..
saluti

Sul server hanno montato il DB e anche SharePoint SQL, ma il vero problema nasce proprio dal fatto che questi signori si sono dimenticati di manutenere il DB.

Ad oggi siamo arrivati a queste conclusioni:
1. DB Molto grande a causa di file temporanei, log e altro mai deletati e lasciati li a diventare sempre piu' mastodontici. Stiamo parlando di un file di log con 4 milioni di record mai letto da nessuno.
2. La macchina su cui e' montato il DB e' mal settata swappa sempre e la CPU la si ritrova quasi sempre al 100% con programmi inutili che ci girano sopra.
3. Le query hanno un tempo medio che va dai 5 sec per le piu piccole, ai 40-50 sec per le piu grandi.
4. Le query sono mal costruite perche' per ogni click fatto dall'utente tirano su quasi tutta l'anagarfica degli utenti richiedendo sempre i stessi dati, in questo modo per inserire un ordine di produzione si arriva a toccare 1 ora.
5. Non ci sono indici sul DB.
6. A causa di tutti i difetti sopra elencati alcune query mandano il Time Out l'applicativo facendo ripetere la stessa operazione all'utente 5-8 volte.
7. Riscontriamo che ogni DB ha una media di 30-40 Functions.
8. Riscontriamo che il DB dei Log non viene aperto e viene visualizzato un errore di Time Out.
9. La dimensione complessiva del DB e' di 54 GB.
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
spyto wrote:

Hai ragione ho scritto veramente da cane, ma dovevo vedere diverse cose e mi sono distratto
succede, non ti preoccupare

In pratica quello che si potrebbe fare come primo step per sbloccare la situazione e pulire il DB visto che vi sono molti record non cancellati, ovvero loro inseriscono dati, li processano e poi li storicizzano. Ma nel momento che il dato viene passato allo storico l'originale rimane nella tabella principale e si creano record inutili.
ok, in questo caso potresti beneissimo, sempre che l'applicativo lo gradisca, eliminare come hai indicato le righe gia' aggregate/storicizzate..
Altra cosa vi sono query con SELECT *, ma li dipende dall'applicativo, vediamo se riesco a risalire a chi l'ha fatto per chiedere
spiegazioni in merito.
molto bene

Sul server hanno montato il DB e anche SharePoint SQL, ma il vero problema nasce proprio dal fatto che questi signori si sono dimenticati di manutenere il DB.
non penso tocchi a loro.. solitamente queste sono incombenze che spettano alo staff IT interno o, nella "peggiore delle ipotesi" e cioe' nei casi in cui tutto "dipenda dall'applicativo gestionale" (e non da SharePoint, ovviamente), all'applicativo stesso, che dovrebbe includere delle funzionalita' amministrative...

Ad oggi siamo arrivati a queste conclusioni:
1. DB Molto grande a causa di file temporanei, log e altro mai deletati e lasciati li a diventare sempre piu' mastodontici. Stiamo parlando di un file di log con 4 milioni di record mai letto da nessuno.
stiamo sicuramente parlando di un modello di recovery "full" impostato per le basi dati in argomento, e, in questo caso, sarebbe consigliabile un backup del log delle transazioni, ovviamente seguito da un backup completo... visto che ci sei, consiglierei anche di valutare la creazione di un piano di backup che consenta di agevolare situazioni di disaster recovery che, da quanto dici, non mi pare sia stato implementato..
valuterei la possibilita' di definire chiaramente le responsabilita' amministrative sul sistema in generale, cosi' da documentare le rispettive responsabilita' in toto..

2. La macchina su cui e' montato il DB e' mal settata swappa sempre e la CPU la si ritrova quasi sempre al 100% con programmi inutili che ci girano sopra.
segare ...

3. Le query hanno un tempo medio che va dai 5 sec per le piu piccole, ai 40-50 sec per le piu grandi.
4. Le query sono mal costruite perche' per ogni click fatto dall'utente tirano su quasi tutta l'anagarfica degli utenti richiedendo sempre i stessi dati, in questo modo per inserire un ordine di produzione si arriva a toccare 1 ora.
questa e' sicuramente una modifica da richiedere a chi ha sviluppato l'applicativo..

5. Non ci sono indici sul DB.
questa e' piu' che sicuramente una modifica da richiedere SUBITO a chi ha sviluppato l'applicativo..

6. A causa di tutti i difetti sopra elencati alcune query mandano il Time Out l'applicativo facendo ripetere la stessa operazione all'utente 5-8 volte.
questa e' sicuramente una modifica da richiedere a chi ha sviluppato l'applicativo..

7. Riscontriamo che ogni DB ha una media di 30-40 Functions.
tendenzialmente, nulla da eccepire... ovviamente andrebbe valutato in loco..
8. Riscontriamo che il DB dei Log non viene aperto e viene visualizzato un errore di Time Out.
il log non viene "aperto" da nessuno se non da SQL Server stesso... cosa sicuramente e' necessaria e' la definizione di una corretta politica di backup al fine di limitare i danni derivanti da disastri accidentali..
9. La dimensione complessiva del DB e' di 54 GB.
tendenzialmente, nulla da eccepire... puo' avere senso
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.