Velocita query db e firedac

di il
8 risposte

Velocita query db e firedac

Sto usando componenti firedac per collegarmi con un db mysql.

Ho una query che è del tipo:
'select c2,c3,c4,c5 from tabella whre c1.id =
(SELECT max (id) FROM tabella WHERE c1=2 AND ts<='2022-02-24 06:22:21' and c6 in (28,29,30,31) )



in pratica devo estrarre l ultimo record inserito prima di una certa data con clausula where
Creo a runtime un oggetto tfdquery, gli assegno la connessione, gli assegno la stringa query da eseguire, gli assegno i parametri della query e la eseguo.

ma ho notato che è davvero lenta, la cosa strana è che la stessa query la eseguo in heidi la esegue velocemente, parliamo di o.4 secondi in heidi contro 10 circa in delphi,
da cosa puo' dipendere?

grazie

p.s. stessa cosa con :
'select c2,c3,c4,c5 from tabella whre WHERE c1=2 AND ts<='2022-02-24 06:22:21' and c6 in (28,29,30,31) order by id desc limit 1

con heidi circa 0.3 secondi, da delphi piu di 10..

da cosa puo' dipendere?

8 Risposte

  • Re: Velocita query db e firedac

    ziobacco ha scritto:


    Creo a runtime un oggetto tfdquery, gli assegno la connessione, gli assegno la stringa query da eseguire, gli assegno i parametri della query e la eseguo. ma ho notato che è davvero lenta [...]
    da cosa puo' dipendere?
    Io aggiungerei qualche informazione in più, ad esempio la configurazione del componente TFDConnection e della TFDQuery.

    Oltre a questo, come utilizzi i record recuperati dalla query? Usi qualche tipo di cache?

    Prova a postare anche il codice di cui parli (.pas e/o .dfm), così diamo un'occhiata che non ci siano magagne di qualche tipo.

    Ciao!
  • Re: Velocita query db e firedac

    La connection e l oggetto a dir la verità le ho piazzate e lasciate di default a parte aggiungere a runtime i parametri per la connessione:
      FDHistoryDBConnection.Params.Database := MARIADB_HISTORYDB;
      FDHistoryDBConnection.Params.UserName := K_MARIADB_USERNAME;
      FDHistoryDBConnection.Params.Password := K_MARIADB_PASSWORD;
      FDHistoryDBConnection.Params.DriverID := K_MARIADB_DRIVERNAME;
      FDHistoryDBConnection.DriverName      := K_MARIADB_DRIVERNAME;
      FDHistoryDBConnection.Params.Values['Server'] := MARIADB_SERVER;
      FDMySQLLink.VendorLib := ExtractFileDir(application.ExeName)  +'\libmysql.dll'
    il dfm della cnnection è:
     object FDHistoryDBConnection: TFDConnection
    
        ResourceOptions.AssignedValues = [rvAutoReconnect]
        ResourceOptions.AutoReconnect = True
        Connected = True
        AfterConnect = FDHistoryDBConnectionAfterConnect
        AfterDisconnect = FDHistoryDBConnectionAfterDisconnect
        Left = 104
        Top = 24
      end
    e il dfm della query è :
    object fdqryTmp: TFDQuery
        Connection = FDHistoryDBConnection
        Left = 448
        Top = 176
      end
    codice per usare la query è:
    with HistoryDataModule.fdqryTmp do
          begin
              Connection := HistoryDataModule.FDHistoryDBConnection;
              Close;
              sql.Clear;
    
              sql.Text := ' SELECT * FROM '+ tabella +' WHERE id = (SELECT max(id) FROM '+tabella +' WHERE unitid=:pUnitID ';
              sql.add(' AND eventtime <=:pDataDA and eventtype in '+ EventTypeList +')' );
    
              ParamByName('pUnitID').AsInteger := mySelectedPu;
              ParamByName('pDataDa').AsDateTime := DaData;
    
              Open();

    se serve posto uno screenshot delle proprietà ma a parte mettere autoreconnect a true nelle proprietà della connessione il resto credo sia tutto di default in effetti
  • Re: Velocita query db e firedac

    Il tempo di 10 secondi lo impiega quindi nell'esecuzione del metodo Open()?
    Hai provato a fare debug passo per passo per controllare che sia così?

    Ciao!
  • Re: Velocita query db e firedac

    Si si, breakpoint sulla riga open, f8, 10 secondi per passare alla riga sucessiva, proprio sull ' esecuzione della open, sto provando a dargli in pasto gli indici ma non mi sembra cambi molto.
  • Re: Velocita query db e firedac

    Comunque il tutto è collegato al mio post sui grafici tchart, perchè volevo caricare l ultimo punto precedente alla finestra temporale di ricerca dei dati.

    cioe se io ho una ricerca che va dalle 10 alle 12, se il primo punto è alle 10.30, dalle 10 alle 10.30 non visualizzero' nulla,
    io vorrei che invece visualizzasse anche l'ultimo punto prima delle 10... per esempio potrebbe essere all 9.30,

    trovando quindi il dato della 9.30, andrei ad avere il disegno del grafico anche nel pezzo dalle 10 alle 10.30 dove prima non lo avevo, non so se sono riuscito a farmi capire in effetti
  • Re: Velocita query db e firedac

    ziobacco ha scritto:


    Si si, breakpoint sulla riga open, f8, 10 secondi per passare alla riga sucessiva, proprio sull ' esecuzione della open, sto provando a dargli in pasto gli indici ma non mi sembra cambi molto.
    Non credo sia una questione di indici, visto che sono usati anche dalle query lanciate dagli ambienti di gestione, e hai detto che eseguendo la query esternamente non hai questo problema.

    Il tutto è strano anche per il fatto che, dietro le quinte, FireDAC usa la stessa libreria client.

    Quanti record restituisce la query?
  • Re: Velocita query db e firedac

    Quella query deve restituire un record solamente, nella tabella ho circa 6 milioni di record, mi puo' venire solo il dubbio che heidi " filtri" in qualche modo i dati e i componenti firedac no (anche se in realtà credo che heidi usi proprio componenti firedac ed è scirtto proprio in delphi), anche se non avrei idea di come.
  • Re: Velocita query db e firedac

    ziobacco ha scritto:


    Quella query deve restituire un record solamente, nella tabella ho circa 6 milioni di record, mi puo' venire solo il dubbio che heidi " filtri" in qualche modo i dati e i componenti firedac no (anche se in realtà credo che heidi usi proprio componenti firedac ed è scirtto proprio in delphi), anche se non avrei idea di come.
    HeidiSQL potrebbe applicare una TOP implicita quando recupera i dati, o comunque scaricare solo un numero limitato di record dal set risultante.

    Puoi comunque sempre provare a fare un test con un altro tool e/o un altro linguaggio per confrontare i risultati.
Devi accedere o registrarti per scrivere nel forum
8 risposte