Mysql 5.7 VBNet 2019 - Query Lenta...solo la prima volta, poi Ok!

di ato il
5 risposte

Salve a tutti.

Dopo aver fatto vari tentativi nella costruzione di una query, finalmente riesco a trovare una query “killer” per la sua velocità.

La prima volta che viene eseguita ci mette un po' di tempo (anche 50/60 secondi), cmq accettabile su 2.000.000 di record, le esecuzioni successive ci mette meno di un secondo.

Se chiudo il programma e lo riapro…50/60 secondi e poi un secondo…mha!

Questo comportamento lo fa solo sul pc del cliente.

Qualcuno, per cortesia, potrebbe darmi qualche spiegazione ?

Grazie

5 Risposte

  • Non sappiamo manco qual è la query…… :/

  • 60 secondi per 2 milioni di record E ASSURDO! 

    Io ho una tabella da 10 MILIARDI di record e sta una manciata di secondi. 

    ---

    La tua query e' progettata male E mancano gli indici.

    Ovviamente questo e' il motivo nel 99% dei CASI. 

    Usa il QUERY PLAN 

    https://dev.mysql.com/doc/refman/8.0/en/execution-plan-information.html 

    per capire dove perde tempo: le parole MAGGGICCCHE che NON DEVONO ESSERE PRESENTI sono  … rullo di tamburi … “Full Scan”  !

    ---

    Il perche' la prima volta e' lenta e poi veloce e' BANALE: uso della cache e la cache dipende dalla connessione.

    Fai in modo che la query abbia una parte VARIABILE, cioe' che cambia ogni volta che la invochi, vedrai che in questo modo impieghera' sempre 60 s.

  • Si, scusate, siccome la query è davvero banale non pensavo che fosse importante (errore mio)…eccola :

     select CONCAT(`Codice Cliente`,'*',ifnull(Codice_Periferia,'')) as `Codice`,
    `Nominativo`,trim(concat(ifnull(`Indirizzo`,''),' ',ifnull(`Numero Civico`,''),if(Ifnull(Esponente,'')='','',concat('/',Esponente)))) as Indiriz,Cap
    Citta,Provincia, Frazione, ifnull(Nazione,'') as Nazione 
    from clienti
    where Nominativo like 'A%' And ifnull(Citta,'')<>'' 
    and Convert(ifnull(Cap,'0'),UNSIGNED)>0 
    and IfNull(Indirizzo,'')<>''

    Il db è MyIsam

    ovviamente gli indici ci sono. Sia sul codice cliente (Key Btree) che sul campo ID (Primary) ed anche sul campo nominativo (Key Btree)

    Il problema è che sul mio pc ci mette sempre lo stesso tempo (molto veloce max 10 secondi), sul pc del cliente…la prima volta ci mette qualche secondo (40/50), poi è quasi immediata, anche se cambio la query (per esempio Citta='Milano', oppure Nominativo Like ‘B%’ anzichè ‘A%’). Mentre se chiudo il programma e lo riavvio…si ripete lo scenario, la prima interrogazione ci mette un po' mentre le altre sono quasi immediate.

    Il perche' la prima volta e' lenta e poi veloce e' BANALE: uso della cache e la cache dipende dalla connessione.

    Potresti darmi qualche consiglio su come configurarlo al meglio?

    Io ho una tabella da 10 MILIARDI di record e sta una manciata di secondi. 

    Woow. Hai una configurazione particolare del file di setup di MySql?

    Vi ricordo che uso vbnet 2019.

  • Nessuna configurazione particolare SOLO fatto gli indici giusti.

    TUTTI il tuo problema sta QUI

    where Nominativo like 'A%' And ifnull(Citta,'')<>'' 
    and Convert(ifnull(Cap,'0'),UNSIGNED)>0 
    and IfNull(Indirizzo,'')<>''

    Questa condizione e' da “DEFENESTRAZIONE dal 28-mo piano” e SENZA paracadute!

    1. questa condizione OBBLIGA a fare un FULLSCAN della tabella. NON SI FA
    2. al posto della ‘like’ usa un indice FULLTEXT (https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html )
    3. nella WHERE EVITA  COME LA LEBBRA la funzione “ifnull()” ed USA il predicato “IS NULL”, 

    .

    Per essere precisi: non si fa A MENO CHE non sia usata in una funzionalita' di servizio/manutenzione, eseguita saltuariamente e per cui i tempi di esecuzione non sono un problema.

    SE la condizione su nominativo e' sempre presente, l'indice fulltext dovrebbe ridurre i tempi a MENO DI UN SECONDO.

    ---

    Per la cache: NON TOCCARE NULLA!

    Per 2 milioni di record (praticamente un piccolo topolino rispetto a quello che puo' fare MySQL) non serve.

    ---

    Per i problemi sul PC del cliente: 

    BOH! Strano!

    Problemi di rete?

    ---

    Regola aurea: TUTTE LE QUERY dovrebbero stare (MOOOOLTO) MENO DI UN SECONDO.

    Ma come tutte le regole, esistono le eccezzioni ;-)

  • Ti ringrazio per avermi risposto.

    Mi documenterò.

    Grazie ancora (a tutti).

Devi accedere o registrarti per scrivere nel forum
5 risposte