none
Query con Join su SQL Server molto lenta RRS feed

  • 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 ASC

     grazie

    martedì 18 marzo 2014 16:48

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

    mercoledì 19 marzo 2014 11:49
    Moderatore

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

    mercoledì 19 marzo 2014 09:18
    Moderatore
  • 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

    mercoledì 19 marzo 2014 10:25
    Moderatore
  • 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.


    mercoledì 19 marzo 2014 11:06
  • Penso di aver risolto, ho creato gli indici sulle FK per le tabelle lavorazioni e Risultati 

    semplicemente

    CREATE INDEX ris_index 
    ON Risultati(Lavorazione)


    mercoledì 19 marzo 2014 11:43
  • 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

    mercoledì 19 marzo 2014 11:49
    Moderatore
  • 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

    mercoledì 19 marzo 2014 12:08