Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Aiuto Per Ottimizzare Una Query

    Salve a tutti,

    volevo chiedere se potevate autarmi migliorare questa query:


    codice:
    SELECT DISTINCT tab1.campo1, tab2.campo2, task.campo3, somma1, somma2  
     
    FROM (  
    
    tab1  LEFT JOIN task ON tab1.task_idtask = task.id )  
    
    LEFT JOIN tab2 ON tab1.task_idtask = tab2.task_id   
    
    LEFT JOIN (SELECT task_id,
                   SEC_TO_TIME(SUM(TIME_TO_SEC(`tempo_lavorato`))) AS somma1             
                   FROM tab2       
                   GROUP BY task_id) A ON (A.task_id = tab1.task_idtask) 	 
    
    LEFT JOIN (SELECT task_id,
                    SEC_TO_TIME(SUM(TIME_TO_SEC(`tempo_lavorato`))) AS somma2            
                    FROM tab2              
                    WHERE tab2.user=5       
                    GROUP BY task_id) B ON (B.task_id = tab1.task_idtask)

    Il database che sto usando è MYSQL. La query funziona perfettamente, però vorrei cercare di ottimizzarla se possibile. Le prime 2 join sono necessarie perchè devo usare campi sia di tab1 sia di tab2 sia di task, mentre le ultime 2 mi servono per avere (per ogni record uscito dalle prime 2 JOIN) la SOMMA di un campo time presente in tab2.

    Ho anche preso in considerazione le VISTE però la tabella risultante da questa query deve essere modificabile quindi mi servirebbero VISTE AGGIORNABILI che purtroppo non supportano
    JOIN, UNION o altri FROM (inclusa la clausola DISTINCT).


    Avete qualche idea?

    Spero di essere riuscito a spiegarmi, se avete altre domande chiedete pure..

    Grazie mille
    **Non voltarti due volte, la strada è avanti**

  2. #2
    se hai la prossibilita' di modificare il database crea degli index (con l'istruzione CREATE INDEX) sui campi delle varie tabelle inserendo come nomi di campi i campi che hai inserito sulla left join per quella tabella

  3. #3
    Ok, se non erro Mysql dovrebbe crearli automaticamente sulle tabelle che ho creato.

    Al di là di questo ho la possibilità di modificare la base di dati, quindi se ho capito bene nella fattispecie dovrei creare degli indici solo per le ultime 2 query con task_id, somma1, somma2 come campi dell'indice.

    Gli indici servono ad aumentare le prestazioni della query, cmq una volta creati la query come sintassi e struttura rimarrebbe la stessa vero?

    codice:
    SELECT DISTINCT tab1.campo1, tab2.campo2, task.campo3, somma1, somma2     
    
    FROM (    
    tab1  
    
    LEFT JOIN task ON tab1.task_idtask = task.id )    
    LEFT JOIN tab2 ON tab1.task_idtask = tab2.task_id     
    
    
    //----------L'INDICE ANDREBBE PER QUESTE 2 QUERY QUI SOTTO?---------
    
    LEFT JOIN (SELECT task_id,  
                  SEC_TO_TIME(SUM(TIME_TO_SEC(`tempo_lavorato`))) AS somma1        
                  FROM tab2                     
                  GROUP BY task_id) A ON (A.task_id = tab1.task_idtask) 	  
     LEFT JOIN (SELECT task_id, 
             SEC_TO_TIME(SUM(TIME_TO_SEC(`tempo_lavorato`))) AS somma2                         
      FROM tab2                              
     WHERE tab2.user=5                       
     GROUP BY task_id) B ON (B.task_id = tab1.task_idtask)
    **Non voltarti due volte, la strada è avanti**

  4. #4
    si, per quel che mi ricordo su un corso che ho fatto un decennio fa(!!!), le istruzioni sulla distinct vengono eseguite in maniera seriale (una istruzione alla volta per ogni record trovato) e non parallela, quindi per ottimizzare l'istruzione l'unica speranza che hai e' quella di far eseguire quante piu' istruzioni in parallelo.
    Per far questo puoi aggiungere degli index che fanno elaborare piu' istruzioni contemporanemente quando viene richiamato il campo dell'index

  5. #5
    ok...provo un po a crearli e ad eseguire la query e vedere che vedo miglioramenti in termini di tempistica.

    Grazie per ora....

    PS: se c'è qualcuno che ha altre idee in mente è il benvenuto
    **Non voltarti due volte, la strada è avanti**

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    per ordine.

    1) non esiste una esecuzione in parallelo per mysql, è sempre in via seriale.

    2) gli indici servono se hanno selettività elevata

    3) non vengono minimamente creati in modo automatico

    4) se fai dei gran "mischioni", in generale, non puoi attenderti miracoli

    5) se posti un dump delle tabelle con le prime righe facciam prima

  7. #7
    Sono d'accordo cone te per la 1) e la 2) ma non sulla 3) e la 4).

    Quando dicevo che gli indici venivano creati automaticamente intendevo quelli sulle chiavi primarie di ogni singola tabella! E' chiaro che se necessito di altri li devo creare a mano io con la CREATE INDEX.

    Ovviamente se faccio un "gran mischione" miracoli non me ne aspetto, il mischione nasce dal fatto che ho bisogno di fare 2 JOIN in più del normale quindi 4 in totale.

    Faccio un po di prove e cerco di risolvere..appena posso ti posto le mie tabelle!
    **Non voltarti due volte, la strada è avanti**

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da Androsx5
    Quando dicevo che gli indici venivano creati automaticamente intendevo quelli sulle chiavi primarie di ogni singola tabella! E' chiaro che se necessito di altri li devo creare a mano io con la CREATE INDEX.
    non è detto.

    1) se hai tabelle myisam puoi anche non avere chiavi primarie

    2) se hai tabelle innodb, al contrario, anche se non definisci una chiave primaria ne verrà aggiunta una "occulta" autoincrementante, con relativo indice, che sarà per inciso quella usata per l'indicizzazione di ogni... successivo indice

  9. #9
    ok il DB usa come engine INNOBD perchè mi servono le transazioni, dovevo scriverlo!

    In ogni mia tabella INNODB è presente una chiave primaria.

    Nel caso usassi nel MyIsam e mettessi chiavi primarie avrei però un indice creato di default sulle chiavi primarie?

    usando:

    SHOW INDEX FROM tabella;

    dove tabella è con engine MyIsam con chiave primaria mostra l'indice che ti dicevo poc'anzi, ecco perchè non mi tornava!
    **Non voltarti due volte, la strada è avanti**

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.