Principale utente con più risposte
Query con Join su SQL Server molto lenta

Domanda
-
Buongiorno
Sto usando SQL Express 2008 R2 ed ho un problema di estrazione di dati molto lenta, in una query con Join e la cui durata è di circa 1 h e 20 min.
Cmq ho la necessità di estrarre dati di circa 1 mese di lavoro i cui record sono circa 50 mila
Qualcuno mi sa dire se la dimensione di 2 tabelle (Lavorazioni,Risultati) di circa 45 mega può rappresntare il problema della lentezza.
La query è la seguente
SELECT Lavorazioni.Pezzo, Lavorazioni.Ricetta, Processi.Nome AS Processo,
Esito = CASE WHEN Lavorazioni.Esito = 0 THEN 'NOK' WHEN Lavorazioni.Esito = 1 THEN 'OK' END,
Lavorazioni.DataOra, TipoRis.Nome AS TipoRis, Risultati.Valore,
Risultati.LimiteH, Risultati.LimiteL
FROM Pezzi RIGHT OUTER JOIN Lavorazioni ON Pezzi.Seriale = Lavorazioni.Pezzo
left OUTER JOIN Processi ON Lavorazioni.Processo = Processi.ID Left Outer Join
Stazioni ON Processi.Stazione = Stazioni.ID
left OUTER JOIN Risultati ON Lavorazioni.ID = Risultati.Lavorazione
left OUTER JOIN TipoRis ON TipoRis.ID = Risultati.TipoRis
WHERE Processi.Stazione =3 AND DataOra >= '2014-03-17T11:27:09' AND DataOra <= '2014-03-18T12:27:23'
ORDER BY Lavorazioni.DataOra DESC, Lavorazioni.Processo ASCgrazie
Risposte
-
Se le righe sono sopra al milione, con Express (1 solo processore), su un disco lento, su di un server non troppo "carenato" e se non avevi indici, allora mi spiego la lentezza. Col piano avrai capito che la tua query non faceva altro che SCAN di SCAN di SCAN... ecc.
Il disegno dei corretti indici però non farlo con leggerezza. Essi andrebbero disegnati in base all'utilizzo che ne fai non solo a fronte di una query, ma di un'analisi sulle interrogazioni che a regime quel database riceve.
Inoltre, con la creazione di indici, aumenti anche lo spazio su disco, cosa non sottovalutabile dal momento in cui Express non ti dà più di 10GB (t-log e data file). Quindi fai attenzione a non riempire di indici "overlapped" o duplicati, analizzando bene la tua situazione reale come detto sopra.
ciao!
Alessandro Alpi SQL Server MVP
- Contrassegnato come risposta Alessandro AlpiMVP, Moderator mercoledì 25 maggio 2016 07:49
Tutte le risposte
-
puoi usare l'estimated execution plan di sql server management studio per tentare di capire qual'è il problema
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org- Proposto come risposta Alessandro AlpiMVP, Moderator giovedì 20 marzo 2014 12:14
-
Ciao,
quello che consiglia Edoardo è necessario per capire quali indici sta usando il motore e anche quali operazioni sta eseguendo. Rimane il fatto che 1h e 20 sono veramente eterni per così poche informazioni.
Se vuoi sapere però se la struttura può essere un problema, ci serve che tu ce la descriva, magari con un CREATE TABLE. Questo ci aiuterebbe a capire quali tipi di dato hai usato.
In aggiunta, se vuoi, puoi provare a passarci un database di esempio con le tabelle popolate, oppure un semplice script di generazione dati + strutture, in modo da provare una tua situazione reale.
Quel tempo è veramente troppo per una query così. Potrebbe essere non solo l'esecuzione in sé, ma anche il lock di alcune risorse. Oppure hai quei tempi quando non succede nient'altro?
Alessandro Alpi SQL Server MVP
-
Ho fatto query restringendo i limiti di tempo a poche ore di produzione, estraendo 370 record, tempo di esecuzione all'interno di Managment studio 23 secondi, veramente inaccetabile...
se poi richiedo una giornata di dati circa 2700 record impiega alcuni minuti.
Il numero di righe per le 2 tabelle più corpose Lavorazioni, Risultati è di circa 1,5 milioni, sono troppi?
Naturalmente ho fatto la prova a ridurre le due tabelle i tempi migliorano, quindi è solo problema di grandezza tabelle? Comunque le tabelle più grandi hanno pochi campi sotto la decina.
-
-
Se le righe sono sopra al milione, con Express (1 solo processore), su un disco lento, su di un server non troppo "carenato" e se non avevi indici, allora mi spiego la lentezza. Col piano avrai capito che la tua query non faceva altro che SCAN di SCAN di SCAN... ecc.
Il disegno dei corretti indici però non farlo con leggerezza. Essi andrebbero disegnati in base all'utilizzo che ne fai non solo a fronte di una query, ma di un'analisi sulle interrogazioni che a regime quel database riceve.
Inoltre, con la creazione di indici, aumenti anche lo spazio su disco, cosa non sottovalutabile dal momento in cui Express non ti dà più di 10GB (t-log e data file). Quindi fai attenzione a non riempire di indici "overlapped" o duplicati, analizzando bene la tua situazione reale come detto sopra.
ciao!
Alessandro Alpi SQL Server MVP
- Contrassegnato come risposta Alessandro AlpiMVP, Moderator mercoledì 25 maggio 2016 07:49
-
Per adesso mi è stato chiesto di velocizzare solo questa query necessaria per tirar fuori dati mensili di produzione.
Abbiamo già concordato che faremo in automatico un'eliminazione periodica dei pezzi più vecchi in maniera da tenere lagrandezza delle tabelle sotto controllo
grazie