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

    [MySQL] lunghezza elaborazione query (over Time)

    Raga urge disperato aiuto !!
    Sono alle prese con un problema di eleborazione query, ho una query che dura circa 3 min e utilizza praticamente tutta la CPU del server, bloccando tutti gli altri utenti che tentano di eseguire qualsiasi cosa.


    Codice PHP:
    SELECT tabella_1.* 
    FROM tabella_2tabella_1 
    WHERE 
    ((tabella_2.DepotCode=tabella_1.COD_FILIALE_OPE
     AND (
    tabella_2.User='codice_user')
     AND (
    tabella_1.COD_CLIENTE NOT IN (SELECT codice_cliente FROM tabella_3))
     AND (
    tabella_1.FLAG_GESTIONE_SEDE !='S'
     AND (
    tabella_1.FLAG_ESCLUSO !='S'))
    GROUP BY tabella_1.COD_CLIENTE
    ORDER BY tabella_1
    .N_POS ASC 
    codice:
    CREATE TABLE IF NOT EXISTS `tabella_1` (
      `COD_CLIENTE` varchar(9) default NULL,
      `COD_GRUPPO` varchar(6) default NULL,
      `COD_IPERGRUPPO` varchar(15) default NULL,
      `DESCR_GRUPPO` varchar(60) default NULL,
      `PROVENIENZA_VIRTUALE` varchar(1) default NULL,
      `N_POS` int(11) default NULL,
      `CLUSTER_TOP` varchar(1) default NULL,
      `RAG_SOCIALE` varchar(40) default NULL,
      `INDIRIZZO` varchar(30) default NULL,
      `LOCALITA` varchar(30) default NULL,
      `PROVINCIA` varchar(3) default NULL,
      `CAP` varchar(9) default NULL,
      `PREF_TELEFONO` varchar(7) default NULL,
      `NUM_TELEFONO` varchar(9) default NULL,
      `COD_MERCEOLOGICO` varchar(6) default NULL,
      `COD_AREA_COM` varchar(3) default NULL,
      `DISTRETTO_COM` varchar(3) default NULL,
      `COD_FILIALE_INT_COM` varchar(5) default NULL,
      `COD_FILIALE_DOM_COM` varchar(5) default NULL,
      `COD_AREA_OPE` varchar(3) default NULL,
      `DISTRETTO_OPE` varchar(3) default NULL,
      `COD_FILIALE_OPE` varchar(5) default NULL,
      `COD_STREAM` varchar(1) default NULL,
      `COD_ACQUISITORE` varchar(3) default NULL,
      `NOME_ACQUISITORE` varchar(30) default NULL,
      `MANSIONE_ACQUISITORE` varchar(30) default NULL,
      `COD_VIRTUALE_CLI` varchar(15) default NULL,
      `FATT_LORDO` double default NULL,
      `FLAG_ESCLUSO` varchar(1) default NULL,
      `FLAG_GESTIONE_SEDE` varchar(1) default NULL,
      KEY `COD_CLIENTE` (`COD_CLIENTE`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    
    CREATE TABLE IF NOT EXISTS `tabella_2` (
      `idUser` mediumint(8) unsigned zerofill NOT NULL auto_increment,
      `level` int(2) NOT NULL,
      `cod_acq` varchar(5) default 'ND',
      `User` varchar(10) NOT NULL,
      `Group` varchar(7) NOT NULL,
      `Nome` varchar(155) NOT NULL,
      `Cognome` varchar(155) NOT NULL,
      `Mansione` varchar(100) NOT NULL,
      `DepotCode` varchar(5) default NULL,
      `Region` varchar(3) default NULL,
      `SubRegion` varchar(5) default NULL,
      `Email` varchar(40) NOT NULL,
      `TelMobile` varchar(15) NOT NULL,
      `TelFisso` varchar(15) NOT NULL,
      `attivo` varchar(1) NOT NULL default '1',
      `DepotName` varchar(200) NOT NULL,
      PRIMARY KEY  (`idUser`),
      KEY `TNTUser` (`User`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    
    
    CREATE TABLE IF NOT EXISTS `tabella_3` (
      `pianifica_id` int(11) NOT NULL auto_increment,
      `User` varchar(10) NOT NULL,
      `localita` varchar(100) NOT NULL default 'N.D.',
      `cliente` text NOT NULL,
      `day` int(4) NOT NULL default '0',
      `month` int(4) NOT NULL default '0',
      `year` int(4) NOT NULL default '0',
      `date` varchar(128) NOT NULL default '0',
      `time` varchar(255) NOT NULL default '0',
      `codice_cliente` varchar(9) NOT NULL,
      `nominativo_referente` varchar(150) NOT NULL,
      `mansioni_referente` varchar(150) NOT NULL,
      `telefono_fisso_referente` varchar(15) NOT NULL,
      `telefono_mobile_referente` varchar(15) NOT NULL,
      `fax_referente` varchar(15) NOT NULL,
      `email_referente` varchar(150) NOT NULL,
      `data_insert` timestamp NOT NULL default CURRENT_TIMESTAMP,
      `data_FU` timestamp NULL default NULL,
      `data_RC` timestamp NULL default NULL,
      `data_alert_RP` date default NULL,
      `data_alert_FU` date default NULL,
      `data_alert_RC` date default NULL,
      `indirizzo2` varchar(80) default NULL,
      `localita2` varchar(80) default NULL,
      `appellativo` char(1) default NULL,
      `contatto` char(1) default NULL,
      `email2` varchar(150) default NULL,
      `data_DV` timestamp NULL default NULL,
      `data_alert_DV` date default NULL,
      `closed` char(1) NOT NULL default 'N',
      PRIMARY KEY  (`pianifica_id`),
      KEY `codice_cliente` (`codice_cliente`),
      KEY `TNTuser` (`User`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;








    .

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Innanzitutto è pessima l'idea di usare un campo varchar come identificativo.
    Se non ti servono tutti i campi della tabella 1 evita l'asterisco e seleziona solo le informazioni necessarie.
    Quella clausola not in rallenta di sicuro di parecchio l'esecuzione della query. Dovresti trasformarla in un left join per escludere i codici clienti della tabella3.

  3. #3
    Grazie 1000 nicola75ss
    Speravo in una tua risposta, ricordo un tuo post dove spiegavi come ridurre di parecchio una query grazie anche all'aiuto di un GURU MySQL


    Premetto che la query postata non è mia, in ogni caso mi metto subito all'opera per cercare di fare lo stesso tramite LEFT JOIN





    .

  4. #4
    Sono riuscito a mettere insieme questa cosa, cosa ne pensi ?

    Codice PHP:
    SELECT
    tb1
    .N_POS,
    tb1.COD_CLIENTE,
    tb1.COD_FILIALE_OPE,
    tb1.COD_CLIENTE,
    tb1.CLUSTER_TOP,
    tb1.RAG_SOCIALE,
    tb1.DESCR_GRUPPO,
    tb1.INDIRIZZO,
    tb1.LOCALITA,
    tb1.NOME_ACQUISITORE,
    tb1.COD_FILIALE_DOM_COM,
    tb1.PREF_TELEFONO,
    tb1.NUM_TELEFONO
    FROM tabella_1 
    AS tb1
    LEFT JOIN tabella_2 
    AS tb2 ON tb1.COD_FILIALE_OPE tb2.DepotCode
    WHERE NOT 
    EXISTS 
    SELECT tb3.codice_cliente
    FROM tabella_3 
    AS tb3
    WHERE tb3
    .codice_cliente tb1.COD_CLIENTE)
    AND 
    tb2.User 'F706LHH'
    AND tb1.FLAG_GESTIONE_SEDE != 'S'
    AND tb1.FLAG_ESCLUSO != 'S'
    GROUP BY tb1.COD_CLIENTE
    ORDER BY tb1
    .N_POS ASC 






    .

  5. #5
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Codice PHP:
    SELECT
    tb1
    .N_POS,
    tb1.COD_CLIENTE,
    tb1.COD_FILIALE_OPE,
    tb1.COD_CLIENTE,
    tb1.CLUSTER_TOP,
    tb1.RAG_SOCIALE,
    tb1.DESCR_GRUPPO,
    tb1.INDIRIZZO,
    tb1.LOCALITA,
    tb1.NOME_ACQUISITORE,
    tb1.COD_FILIALE_DOM_COM,
    tb1.PREF_TELEFONO,
    tb1.NUM_TELEFONO
    FROM tabella_1 
    AS tb1
    INNER JOIN tabella_2 
    AS tb2 ON tb1.COD_FILIALE_OPE tb2.DepotCode
    LEFT JOIN tabella_3 ON tb1
    .COD_CLIENTE tb3.codice_cliente
    WHERE 
    tb3
    .codice_cliente IS NULL
    AND tb2.User 'F706LHH'
    AND tb1.FLAG_GESTIONE_SEDE != 'S'
    AND tb1.FLAG_ESCLUSO != 'S'
    GROUP BY tb1.COD_CLIENTE
    ORDER BY tb1
    .N_POS ASC 

  6. #6
    Grazie luca200,
    Lo scarto è minimo 0.0195 contro 0.0190 ma cmq migliore !

    ps - in verità c'era un'altra cosa ben più importante.... indicizzare le tabelle !
    cosa non era stata fatta.


    subito da 3 min. l'esecuzione è passata a 0.17 sec.

    Sicuramente meglio con l'ultima soluzione consigliata.


    Grazie


  7. #7
    Raga, urge nuovo aiuto !
    Penso di avere fatto un pò di casino
    utilizzando le stesse tabelle
    volevo estrarre, utilizzando una nuova tabella con un solo campo in formato "date"
    (che mi serve solo per crearmi il calendario)

    il totale delle visite raggruppate per week
    mi viene fuori un risultato dove mi si valorizza solo il campo wkY
    mi aiutate a capire cosa sbaglio ?!

    Codice PHP:
    SELECT sq . * ,
    DATE_FORMATtb4.data'%x-%v' ) AS wkY
    FROM cal 
    AS tb4
    LEFT JOIN 
    (SELECT 
    tb1
    .CLUSTER_TOP AS TOP,
    tb1.COD_FILIALE_OPE AS FIL,
    tb3.data_alert_DV,
    DATE_FORMATSUBDATEtb3.data_alert_DVINTERVAL 2 DAY ) , '%x-%v' ) AS wkDV,
    COUNTtb1.COD_CLIENTE ) AS TOT,
    COUNTtb3.codice_cliente ) AS TOT_P
    FROM tabella_1 
    AS tb1
    INNER JOIN tabella_3 
    AS tb3
    ON tb1
    .COD_FILIALE_OPE tb3.DepotCode
    LEFT JOIN tabella_2 
    AS tb2
    ON tb1
    .COD_CLIENTE tb2.codice_cliente
    WHERE tb3
    .User '$User'
    GROUP BY wkDV) AS sq
    ON tb1
    .data sq.data_alert_DV
    GROUP BY wkY
    HAVING wkY BETWEEN 
    '2010-08' AND '2010-52'
    ORDER BY wkY ASC 

    10ks



    .

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.