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

    [MySQL] Tempi di esecuzione di query inner join

    Ciao a tutti, ho bisogno di un buon consiglio.

    Eseguo una query inner join su due tabelle mysql:

    tbl_a = 9.290 records
    tbl_b = 3.665.958 records

    La query funziona, ma il tempo di esecuzione all'interno di mysql è superiore ai 5 minuti, sul web si raddoppia.

    Ho già indicizzato i campi delle due tabelle interessate dalla inner join.

    Cosa posso fare per ridurre i tempi di esecuzione?
    Pensavo ad una tabella temporanea, ma si può fare con MySQL?

    Qualche esempio?

    Grazie in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: [MySQL] Tempi di esecuzione di query inner join

    Originariamente inviato da Miguel Rivero
    Ciao a tutti, ho bisogno di un buon consiglio.

    Eseguo una query inner join su due tabelle mysql:

    tbl_a = 9.290 records
    tbl_b = 3.665.958 records

    La query funziona, ma il tempo di esecuzione all'interno di mysql è superiore ai 5 minuti, sul web si raddoppia.

    Ho già indicizzato i campi delle due tabelle interessate dalla inner join.

    Cosa posso fare per ridurre i tempi di esecuzione?
    Pensavo ad una tabella temporanea, ma si può fare con MySQL?

    Qualche esempio?

    Grazie in anticipo.
    non capisco cosa sia per te una query inner join.

    soprattutto se non si sa come son fatte le tabelle, nè quale sia la query.
    postala e vediamo

  3. #3

    Re: Re: [MySQL] Tempi di esecuzione di query inner join

    Originariamente inviato da franzauker
    non capisco cosa sia per te una query inner join.

    soprattutto se non si sa come son fatte le tabelle, nè quale sia la query.
    postala e vediamo
    Ok, ecco la query:

    codice:
     SELECT  C.MCR_Cod , C.MCR_Clt , C.MCR_Den
    
             , SUM(IF(R.Art = '51M' AND R.CDI='P', R.BT*R.sec/60/C.CLIENTIES, 0)) AS '51M'
             , SUM(IF(R.Art NOT IN ('51M','450') AND R.CDI='P', R.BT*R.sec/60/C.CLIENTIES, 0))  AS 'BT'
             , SUM(IF(R.Art = '450' AND R.CDI='P', R.BT*R.sec/60/C.CLIENTIES, 0)) AS 'MT' 
               
             , SUM(IF(R.Art = '51M' AND R.CDI In('P','B'), R.BT/C.CLIENTIES, 0)) AS '51M'
             , SUM(IF(R.Art NOT IN ('51M','450') AND R.CDI In('P','B'), R.BT/C.CLIENTIES, 0)) AS 'BT'
             , SUM(IF(R.Art = '450' AND R.CDI In('P','B'), R.BT/C.CLIENTIES, 0)) AS 'MT'
    
         FROM  _tbl1 R
    INNER JOIN  _tbl2 C ON R.CFT_Cod = C.CFT_Cod
    
         WHERE  1
          AND  C.MCR_Cod ='DNO'
         GROUP BY MCR_Cod, MCR_Clt, MCR_Den
    E la struttura delle 2 tabelle:
    codice:
    -- ----------------------------
    -- Table structure for `_tbl1`
    -- ----------------------------
    DROP TABLE IF EXISTS `_tbl1`;
    CREATE TABLE `_tbl1` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `CFT_Cod` varchar(255) DEFAULT NULL,
      `CDI` varchar(255) DEFAULT NULL,
      `BT` decimal(10,2) DEFAULT NULL,
      `sec` decimal(10,2) DEFAULT NULL,
      `Art` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      KEY `CFT_Cod` (`CFT_Cod`),
      KEY `CDI` (`CDI`),
      KEY `BT` (`BT`),
      KEY `sec` (`sec`),
      KEY `Art` (`Art`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3665958 DEFAULT CHARSET=latin1;
    
    
    -- ----------------------------
    -- Table structure for `_tbl2`
    -- ----------------------------
    DROP TABLE IF EXISTS `_tbl2`;
    CREATE TABLE `_tbl2` (
      `CFT_Cod` varchar(255) DEFAULT NULL,
      `MCR_Cod` varchar(255) DEFAULT NULL,
      `MCR_Clt` int(11) DEFAULT NULL,
      `MCR_Den` varchar(255) DEFAULT NULL,
      `C.CLIENTIES` int(11) DEFAULT NULL,
      `xID` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`xID`),
      KEY `CFT_Cod` (`CFT_Cod`),
      KEY `CLIENTIES` (`CLIENTIES`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9290 DEFAULT CHARSET=latin1;

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: Re: Re: [MySQL] Tempi di esecuzione di query inner join

    Originariamente inviato da Miguel Rivero
    Ok, ecco la query:

    codice:
     SELECT  C.MCR_Cod , C.MCR_Clt , C.MCR_Den
    
             , SUM(IF(R.Art = '51M' AND R.CDI='P', R.BT*R.sec/60/C.CLIENTIES, 0)) AS '51M'
             , SUM(IF(R.Art NOT IN ('51M','450') AND R.CDI='P', R.BT*R.sec/60/C.CLIENTIES, 0))  AS 'BT'
             , SUM(IF(R.Art = '450' AND R.CDI='P', R.BT*R.sec/60/C.CLIENTIES, 0)) AS 'MT' 
               
             , SUM(IF(R.Art = '51M' AND R.CDI In('P','B'), R.BT/C.CLIENTIES, 0)) AS '51M'
             , SUM(IF(R.Art NOT IN ('51M','450') AND R.CDI In('P','B'), R.BT/C.CLIENTIES, 0)) AS 'BT'
             , SUM(IF(R.Art = '450' AND R.CDI In('P','B'), R.BT/C.CLIENTIES, 0)) AS 'MT'
    
         FROM  _tbl1 R
    INNER JOIN  _tbl2 C ON R.CFT_Cod = C.CFT_Cod
    
         WHERE  1
          AND  C.MCR_Cod ='DNO'
         GROUP BY MCR_Cod, MCR_Clt, MCR_Den
    E la struttura delle 2 tabelle:
    codice:
    -- ----------------------------
    -- Table structure for `_tbl1`
    -- ----------------------------
    DROP TABLE IF EXISTS `_tbl1`;
    CREATE TABLE `_tbl1` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `CFT_Cod` varchar(255) DEFAULT NULL,
      `CDI` varchar(255) DEFAULT NULL,
      `BT` decimal(10,2) DEFAULT NULL,
      `sec` decimal(10,2) DEFAULT NULL,
      `Art` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      KEY `CFT_Cod` (`CFT_Cod`),
      KEY `CDI` (`CDI`),
      KEY `BT` (`BT`),
      KEY `sec` (`sec`),
      KEY `Art` (`Art`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3665958 DEFAULT CHARSET=latin1;
    
    
    -- ----------------------------
    -- Table structure for `_tbl2`
    -- ----------------------------
    DROP TABLE IF EXISTS `_tbl2`;
    CREATE TABLE `_tbl2` (
      `CFT_Cod` varchar(255) DEFAULT NULL,
      `MCR_Cod` varchar(255) DEFAULT NULL,
      `MCR_Clt` int(11) DEFAULT NULL,
      `MCR_Den` varchar(255) DEFAULT NULL,
      `C.CLIENTIES` int(11) DEFAULT NULL,
      `xID` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`xID`),
      KEY `CFT_Cod` (`CFT_Cod`),
      KEY `CLIENTIES` (`CLIENTIES`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9290 DEFAULT CHARSET=latin1;
    Mancano le cardinalità di mcr_cod, mcr_clt, mcr_den.
    ---
    Per iniziare hai campi con indici giganteschi.
    Sostituiscili con campi indicizzati che ne contengano il CRC32,
    e metti condizioni del tipo
    where (crc32campo=crc32(valore)) and (campo='valore')

    potresti infatti ridurre la dimensione degli indici (mettendo una lunghezza massima), ma la tecnica crc la porta a 4 byte.

    domani se trovo il tempo ci ragiono di più

  5. #5
    una domanda: se fai una query con le SUM 'secche' senza le IF, i tempi restano gli stessi?

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.