Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881

    [SQL08r2] aiuto query con creaz. tab temporanea

    Ciao
    ho una query in una stored procedure che impiega 1.07 minuti per l'esecuzione mandandomi in timeout la pagina aspnet che la esegue.
    Ho lanciato dall'SQL Management Studio il "Piano di esecuzione Effettivo" e vedo (se ho capito bene come funziona) che molto del tempo sembra essere impiegato dall'order by della query (mi indica un "costo del 28%").
    Nella select seleziono tre campi da tre tabelle diverse, li attacco e li restituisco as nuovocampo (la stessa cosa poi faccio per altri campi di altre tabelle restituendo as nuovocampo2, nuovocampo3 e nuovocampo4) e poi nell'order by indico il nuovocampo, nuovocampo2, nuovocampo3 e nuovocampo4.... mi pare di capire che per fare l'ordinamento debba rifare, all'atto dell'order by, la costruzione dei nuovicampi (mi sono dato questa spiegazione perchè non capisco cos'altro potrebbe essere che fa pesare così l'ordinamento).
    Notare che la select finale restituisce 70 record e l'analisi viene fatta su 40mila record quindi niente di spaventoso.
    Ho fatto indici a profusione ma non è migliorato di molto il risultato.

    Un conoscente mi ha detto di provare a far generare una tabella temporanea ed a farmi restituire i dati con l'order by applicato ai campi della tabella temporanea.... però:
    1- non ho idea di come si faccia questa cosa
    2- non so se sia risolutiva
    3- il processo qual'è? faccio una insert into tabtemporanea select (tutta la mia select di prima senza l'ordinamento), poi una select su tabtemporanea con l'order by che serve a me, e poi? devo far distruggere la tabella temporanea quando la mia pagina aspnet ha finito? che devo fà?
    ...
    Saggi maestri jedi di sql e loro consigli sono benvenuti!
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    up
    scusate ma avrei urgenza di risolvere 'sta cosa e non ho "cultura" sufficiente in sql per arrangiarmi
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  3. #3
    Ciao,

    non so se riuscirai a risolvere,
    ma con la tua versione di sql server puoi usare una variabile di tipo table nella sp:

    DECLARE @temp TABLE(Col1 INT)

    Sui BOL o in rete troverai esempi in quantità.

    HTH

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Potrebbero esserci diversi modi.

    a me personalmente le tabelle temporanee non piacciono.


    Passaci lo script delle 3 tabelle

    qualche dato

    e la relativa stored


    .

  5. #5
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    eccomi scusate, credevo di aver risolto e invece stamattina il problema si è ripresentato... 1:14 mins di esecuzione per tirarmi fuori 100 record (e dovrei anche togliere il top 100 quando riesco a farla andare)

    la stored è la seguente (non inorridite):
    codice:
    SELECT  top 100 
    tbl_fg_temp.giorno, 
    tbl_fg_temp.tipo, 
    (tbl_mezzi.matricola + ' - ' + tbl_mezzi.descrizione + ' ' + tbl_mezzi.targa) as descrmezzo, 
    (convert(varchar(10),tbl_personale.matricola) + ' - ' + tbl_personale.cognome + ' ' + tbl_personale.nome) as descrautista, 
    descrjob = Case tbl_fg_temp.tipo 
            WHEN 'T' THEN 
    	    tbl_turni_teste.codice + ' - ' + tbl_turni_teste.descrizione          
            ELSE
                'Lav.n.' + convert(varchar(10),tbl_lavori_teste.ID )  + ' - ' + tbl_lavori_teste.descr_fatt   
            END , 
    tbl_chiusure.ID as IDchiusura, 
    IDjob = Case tbl_fg_temp.tipo    
            WHEN 'T' THEN 
                tbl_turni_teste.ID  
            ELSE 
                tbl_lavori_teste.ID 
            END ,
    convert(varchar(10), tbl_fg_temp.giorno) + '§§§'+ tbl_fg_temp.tipo + '§§§'+ Case tbl_fg_temp.tipo    
           WHEN 'T' THEN 
               convert(varchar(10), tbl_turni_teste.ID)  
            ELSE 
               convert(varchar(10), tbl_lavori_teste.ID) 
            END + '§§§' + CONVERT(varchar(10),tbl_fg_temp.IDmezzo) + '§§§' + CONVERT(varchar(10),tbl_fg_temp.IDautista) as alldata     
            
           
    FROM tbl_fg_temp  
    left join tbl_personale ON tbl_fg_temp.IDautista = tbl_personale.ID  
    left join tbl_mezzi ON tbl_fg_temp.IDmezzo = tbl_mezzi.ID  
    left join tbl_prev_righe ON tbl_fg_temp.tipo='L' AND tbl_fg_temp.IDriga = tbl_prev_righe.ID 
    left join tbl_lavori_teste ON tbl_prev_righe.IDtesta = tbl_lavori_teste.ID  
    left join tbl_turni_righe ON tbl_fg_temp.tipo='T' AND tbl_fg_temp.IDriga = tbl_turni_righe.ID 
    left join tbl_turni_teste ON tbl_turni_righe.IDtesta = tbl_turni_teste.ID 
    left join tbl_clienti ON      
            (tbl_fg_temp.tipo='T' and tbl_turni_teste.ID = tbl_clienti.ID)  OR  (tbl_fg_temp.tipo <> 'T' and tbl_lavori_teste.IDcliente = tbl_clienti.ID ) 
    left join tbl_chiusure on 
           (tbl_fg_temp.tipo='T' AND tbl_chiusure.idjob = tbl_turni_teste.ID AND tbl_fg_temp.giorno = tbl_chiusure.giorno AND tbl_fg_temp.IDautista = tbl_chiusure.IDautista AND tbl_fg_temp.IDmezzo = tbl_chiusure.IDmezzo)  OR   (tbl_fg_temp.tipo <> 'T' AND  tbl_chiusure.idjob = tbl_lavori_teste.ID AND tbl_fg_temp.giorno = tbl_chiusure.giorno AND tbl_fg_temp.IDautista = tbl_chiusure.IDautista AND tbl_fg_temp.IDmezzo = tbl_chiusure.IDmezzo) 
           
    WHERE tbl_fg_temp.ditta = @ditta 
    AND tbl_fg_temp.sede = @sede 
    AND tbl_chiusure.ID is null 
    AND tbl_fg_temp.tipoaut='A' 
    AND tbl_fg_temp.giorno >= @datada  
    AND tbl_fg_temp.giorno < @dataa 
    AND ((tbl_fg_temp.tipo='L' AND tbl_lavori_teste.dataarrivo < @dataa) OR tbl_fg_temp.tipo='T')
            
    GROUP BY tbl_fg_temp.giorno, 
    tbl_fg_temp.tipo,  
    (tbl_mezzi.matricola + ' - ' + tbl_mezzi.descrizione + ' ' + tbl_mezzi.targa), 
    (convert(varchar(10),tbl_personale.matricola) + ' - ' + tbl_personale.cognome + ' ' + tbl_personale.nome), 
    Case tbl_fg_temp.tipo         
        WHEN 'T' THEN 
            tbl_turni_teste.codice + ' - ' + tbl_turni_teste.descrizione    
        ELSE 
            'Lav.n.' + convert(varchar(10),tbl_lavori_teste.ID 	) + ' - ' + tbl_lavori_teste.descr_fatt    
        END ,
    tbl_chiusure.ID, 
    Case tbl_fg_temp.tipo   
          WHEN 'T' THEN 
              tbl_turni_teste.ID 
           ELSE 
             tbl_lavori_teste.ID  
           END, 
    convert(varchar(10), tbl_fg_temp.giorno) + '§§§'+ tbl_fg_temp.tipo + '§§§'+ Case tbl_fg_temp.tipo    
           WHEN 'T' THEN 
            	 convert(varchar(10), tbl_turni_teste.ID)  
            ELSE 
            	 convert(varchar(10), tbl_lavori_teste.ID) 
            END + '§§§' + CONVERT(varchar(10),tbl_fg_temp.IDmezzo) + '§§§' + CONVERT(varchar(10),tbl_fg_temp.IDautista)  
           
            ORDER BY giorno, tipo, descrjob, descrautista, descrmezzo, alldata desc
    non saprei nemmeno come disegnarvi un grafico del db ma vi darò le info che mi chiederete sulla struttura delle tabelle.

    grazie per la pazienza
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  6. #6
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    Intanto ho visto che, togliendo l'order by, ordinare o non ordinare non cambia niente in termini di tempo di esecuzione...
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  7. #7
    le tabelle temporanee sono una mano santa se le si adopera bene. nel tuo caso il concetto potrebbe essere il seguente

    ipotizziamo una query

    SELECT colonne FROM TAB1 JOIN TAB2 ON tab1.colonna=tab2.colonna JOIN tab3 on tab2.colonna=tab3.colonna

    puoi smontarla in

    SELECT INTO tab12 colonne FROM TAB1 JOIN TAB2 ON tab1.colonna=tab2.colonna

    poi

    SELECT colonne FROM TAB12 JOIN tab3 on tab12.colonna=tab3.colonna

    nella tua query sono coinvolte 9 tabelle buon lavoro


  8. #8
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    Ho capito la filosofia, ora devo anche capire come metterla in pratica.... intanto grazie.

    Nel frattempo il mio SQL Management Studio sembra sia diventato un'entità dotata di vita propria.... giuro che non ho capito cosa è successo: nel piano di esecuzione ho visto che utilizzava un indice che avevo creato io sulla tabella, che secondo me non c'entrava niente... allora ho cancellato l'indice dalla tabella (brutalmente) e ho rilanciato la storedprocedure col piano di esecuzione effettivo ed a quel punto la query è stata eseguita in un nanosecondo ed il piano di esecuzione mi ha mostrato un grafico completamente diverso da quello di prima, in cui mi informa che gli manca un indice (quello che avevo eliminato), che la cosa aveva un impatto di 17.912345 sull'esecuzione della query.... dopodichè l'sqlmanagementstudio è impazzito ed ora mentre scrivo sta facendo fumare la ventola del pc e mi spara finestre in sovrimpressione... ora ficco uno spicchio d'aglio nel drive del cd e gli pianto un paletto di legno nell'hard disk.
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    stranissimo fatto.... senza l'indice è diventata una scheggia....
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.