+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Migliorare la velocità della query

  1. #1
    ato
    ato non è in linea Novello
    Post
    20

    Migliorare la velocità della query

    windows server 2012
    MySql server 5.7

    Buongiorno a tutti,
    volevo chiedervi, per cortesia, se il modo di come è scritta questa query..è il modo migliore, insomma più efficiente e che dia il risultato nel minor tempo possibile.

    Ho 2 tabelle :

    clienti
    movimenti

    devo ottenere l'elenco dei clienti (anche di quelli che non hanno fatto nessun movimento) con il numero dei movimenti ed il totale (euro) sia parziale che totale, cioè se un cliente ha fatto 10 movimenti per un totale di 1000 euro e supponiamo che nel filtraggio rientrino solo 3 dei movimenti per un totale parziale di 700 euro, la query deve darmi sia i risultati parziali 3 e 700 che i totali ovvero 10 e 1000

    questa è la query, e questa funziona ma volevo sapere, per cortesia, se è il modo più efficiente

    codice:
    SELECT clienti.codice,
               clienti.nominativo,
    	   COUNT(movimenti.progressivo) AS numParz,
    	   SUM(ifnull(movimenti.importo,0)) AS totParz,
    	   IFNULL(vt.NumMovTot,0),
    	   IFNULL(vt.Totale,0)
    
    FROM clienti
    
    LEFT JOIN movimenti ON movimenti.CodiceCliente=clienti.Codice
    
    LEFT JOIN
    ( 
      SELECT movimenti.CodiceCliente AS codiceCliente,
      COUNT(movimenti.progressivo) AS numMovTot,
      SUM(movimenti.importo) AS Totale
      FROM movimenti
      GROUP BY movimenti.codiceCliente
    ) vt
    ON vt.CodiceCliente=clienti.Codice
    
    where codnizioni varie
    
    GROUP BY clienti.Codice
    qui potete scaricare il database azienda per poter fare eventuali prove

    https://www.dropbox.com/s/rlj92e9lvx...ienda.sql?dl=0

    questo è il risultato di explain della query

    https://www.dropbox.com/s/2bwo0qquae...query.png?dl=0

    confido nel vs aiuto oper ottimizzare al meglio la query
    Vi saluto
    Ultima modifica di AntonioG; 25-11-2019 09:32  Motivo: Tag CODE

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,389
    Blogs
    5
    Perché in Pausa Caffè?

    Sposto in MySql
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    ato
    ato non è in linea Novello
    Post
    20
    oops scusatemi. Non me ne ero accorto...è da tanto che non scrivevo in questo forum.
    Se non è un problema, per cortesia potresti provvedere tu a spostarlo,sempre che tu non lo abbia già fatto.
    Grazie e scusatemi ancora.

  4. #4
    ato
    ato non è in linea Novello
    Post
    20
    Novità?

  5. #5
    Ferrari_and non è in linea Scolaretto
    Post
    136
    La query in se è corretta. Dovendo fare un totale senza filtri e poi un totale con filtri mi sembra l'unica via.
    Per migliorare le perfomance va studiata la creazione di indici sulle tabelle oltre a quelli principali ma per fare ciò dovresti avere almeno una idea di che tipi di filtri si vanno ad analizzare altrimenti il rischio è creare strutture inutili.

  6. #6
    Dev-01 non è in linea Scolaretto
    Post
    484
    Puoi inoltre utilizzare un profiler (free) per ottenere informazioni più dettagliate sui passaggi operati e, infine ma non meno importante, tenere conto dell'architettura utilizzata (offline, online in rete locale, online, x86, x64).

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi