AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

Ein Thema von Nikolozi · begonnen am 2. Feb 2022 · letzter Beitrag vom 3. Feb 2022
Antwort Antwort
Seite 1 von 2  1 2      
Nikolozi

Registriert seit: 1. Dez 2020
1 Beiträge
 
#1

FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 2. Feb 2022, 13:23
Datenbank: Oracle • Version: 19c Enterprise • Zugriff über: FireDAC
Hallo ,

ich habe so ein interessantes Problem. Ich verwende Bind Variablen in Delphi und auf Datanbankseite wird Database Link (@dblink) verwendet um aus einer Tabelle Daten geholt zu werden. Wenn ich SQL SELECT-Abfrage so schicke , es ist schnell :

Code:
 
SELECT
 DLGH_START_D Datum,
 TRUNC((d.DLGH_ENDE_D - d.DLGH_START_D) * 24 * 60)||' Min '||
 TRUNC(MOD(((d.DLGH_ENDE_D - d.DLGH_START_D) * 24 * 3600), 60))||' Sek' Dauer
FROM
  dialoghistory d
WHERE
 d.DLGH_PARAMETER_C = 'Name of Parameter' AND <--
 d.dlgh_funktion_c = 'SQLS' AND
 d.DLGH_START_D > '01.02.2020' <--
order by 1
aber diese SQL Abfrage mit Bind Variablen dauert ewig:

Code:
SELECT
 DLGH_START_D Datum,
 TRUNC((d.DLGH_ENDE_D - d.DLGH_START_D) * 24 * 60)||' Min '||
 TRUNC(MOD(((d.DLGH_ENDE_D - d.DLGH_START_D) * 24 * 3600), 60))||' Sek' Dauer
FROM
  dialoghistory d
WHERE
 d.DLGH_PARAMETER_C = :B_Name AND <--
 d.dlgh_funktion_c = 'SQLS' AND
 d.DLGH_START_D > :Datum   <--
order by 1
Delphi Code bereinigt:

Code:
qry := TFDQuery.CreateSQL(Application, sSqlText_.Text);
    with qry do begin
    ...
     Param.AsString := value; //Hier die Wert von Bind Variable setzen
    ...
    Open; //Hier wird lange hängen geblieben ~ 1 Stunde . ohne Bind Variablen 1 Sekunde
Es liegt vermutlich an dblink, aber genau was das ist und wie ich es umgehen kann, keine Idee
Nika
  Mit Zitat antworten Zitat
TurboMagic
Online

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.826 Beiträge
 
Delphi 12 Athens
 
#2

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 2. Feb 2022, 21:41
Das muss schneller gehen. Da gibt's doch auch was mit Prepare.
Das reicht normalerweise einmal auszuführen.
Hast du die Möglichkeit den Zugriffs-Plan der DB in beiden Fällen zu vergleichen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#3

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 2. Feb 2022, 23:25
Delphi Code bereinigt:
Und jetzt nochmal nicht ganz so bereinigt - aber wirklich echter Code!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 06:11
Bitte ohne "with". Du tust dir keinen gefallen damit.
Ich hoffe, den zweiten Parameter übergibst du als "AsDateTime".

Benutzt du für den DBLink einen ODBC-Treiber oder arbeitest du native?
Ich habe schonmal gelesen, dass manche ODBC-Treiber mit parametrisierten SQL-Anweisungen Probleme haben.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#5

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 06:38
Moin...
Zitat:
Ich verwende Bind Variablen in Delphi
Begriffsdefinion: meinst du damit Parameter?
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.176 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 06:56
Wie viele Datensätze sind in der Tabelle?
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 06:59
https://en.delphipraxis.net/topic/62...#comment-54473

...schau dir das mal an. Dmitry muss es wissen!
Andreas Schachtner
  Mit Zitat antworten Zitat
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 08:12
Soetwas ähnliches hatte ich auch mal.
Da hatte ich ein Parameter als falsche Variable übergeben.
Beispiel:
ParamByName( 'Integer' ).AsString := 'Test' Obwohl das Feld in der Datenbank ein Integer war!
Das hat Stunden gedauert.

Also ich bin bei @Jasocul mit dem DateTime Paramter
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.419 Beiträge
 
Delphi 7 Professional
 
#9

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 10:23
Wenn hier
Delphi-Quellcode:
 d.DLGH_PARAMETER_C = :B_Name AND
 d.dlgh_funktion_c = 'SQLSAND
 d.DLGH_START_D > :Datum
einer der Parameter vom Typ nicht mit dem der entsprechenden Spalte in der DB übereinstimmt, wird (wenn Du Pech hast) die entsprechende Spalte der Tabelle für jeden Datensatz in den Typen des Parameters umgewandelt und dann verglichen und nicht einmal der Parameter in den Typ der Spalte und dann verglichen.
Und dann war's das mit der Nutzung des Index und schon wird die Laufzeit (schlimmstenfalls) astronomisch hoch.

Bei der schnelle Variante wird Dir der Zugriffs-Plan vermutlich verraten, welcher Index genutzt wird und bei der langsamen Variante steht da (sinngemäß) was von "full table scan".
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: FireDAC: Möglichkeit die Abfrage schneller zu machen? ( in Delphi)

  Alt 3. Feb 2022, 10:42
Ich sehe im SQL keinen DBLink.
Falscher Variabentyp auf Delphiseite könnte schon sein.

DBLinks (bei Oracle) sind ein Thema für sich.
Miserable Geschwindigkeit kann daher rühren, dass der Optimizer sich nicht in der Lage sieht, die Abfrage remote (über Link) zu bewältigen und Daten ungefiltert aus dem DBLink saugt.

Das Verhalten müsste prüfbar sein, wenn man auf Client Code verzichtet und direkt per SQL Client arbeitet.

P.S.: Wie schon angedeutet, ein Paramter in der SQL Abfrage ist etwas anderes als eine Bind Variable in Oracle.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz