AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FireDAC macht unendlich viele Fetches
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC macht unendlich viele Fetches

Ein Thema von OlafSt · begonnen am 21. Apr 2020 · letzter Beitrag vom 23. Apr 2020
Antwort Antwort
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

FireDAC macht unendlich viele Fetches

  Alt 21. Apr 2020, 12:53
Datenbank: MSSQL • Version: 2016 • Zugriff über: FireDAC
Hallo Freunde,

heute ein Mysterium. Ein simples Delphi-Programm (10.2 Tokyo) mit FireDAC. Man nehme eine normale TFDConnection, binde den SQL-Server via "Microsoft ODBC Driver 17 for MSSQL" ein, hänge eine einfache TFDQuery dran und verpasse letzterer ein einfaches Statement: "SELECT * FROM Orte ORDER BY StatOrt". Ein * geht hier in Ordnung, werden eh alle Felder abgefragt.

Die Tabelle hat etwa 30k Einträge, also kein Hexenwerk. Auf unserem internen SQL-Server generiert FireDAC dabei so um die 200 EXEC-Statements, bis alles so weit abgeholt ist.

Nun haben wir bei einem Kundensystem ein Phänomen, bei dem die Anzahl der Exec's regelrecht explodiert, auf >120.000 statt 200. Es ist immer dieselbe Abfolge pro Datensatz:

Code:
declare @p1 int
set @p1=1073741826
declare @p2 int
set @p2=180150009
declare @p5 int
set @p5=8
declare @p6 int
set @p6=1
declare @p7 int
set @p7=11130
exec sp_cursorprepexec @p1 output,@p2 output,NULL,N'SELECT * FROM Orte ORDER BY StatOrt',@p5 output,@p6 output,@p7 output
select @p1, @p2, @p5, @p6, @p7
Dieses Statement ist das SELECT. Es folgt nun:

Code:
exec sp_cursoroption 180150009,1,24
exec sp_cursoroption 180150009,1,25
exec sp_cursorfetch 180150009,2,1,50
exec sp_cursoroption 180150009,3,24
exec sp_cursor 180150009,40,1
-- ab hier repeat
exec sp_cursoroption 180150009,1,24
exec sp_cursoroption 180150009,3,25  -- die 3 ist anders
exec sp_cursor 180150009,40,1 --die 1 ist wohl der Datensatz
exec sp_cursoroption 180150009,1,25
exec sp_cursor 180150009,40,1
exec sp_cursor 180150009,40,1
exec sp_cursor 180150009,40,1
exec sp_cursor 180150009,40,1
exec sp_cursor 180150009,40,1
exec sp_cursoroption 180150009,3,24
exec sp_cursor 180150009,40,2  -- die 2 ist anders
...
...
...
Und diese Kette an Execs für jeden einzelnen Datensatz. Das belastet den Server ganz enorm und das Starten der Anwendung dauert statt eines Wimpernschlags ne geschlagene Minute.

Hat jemand eine Ahnung, was da am SQL-Server umgestellt werden müsste ?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: FireDAC macht unendlich viele Fetches

  Alt 21. Apr 2020, 12:59
Hallo,
Zitat:
Die Tabelle hat etwa 30k Einträge, also kein Hexenwerk. Auf unserem internen SQL-Server generiert FireDAC dabei so um die 200 EXEC-Statements, bis alles so weit abgeholt ist.
1. Und bei Eurem Server sind auch 30.000 Datensätze drin?

2. Ist euer interner Server der gleiche wie beim Kunden? (Versionsnummer usw.)

3. Ist die Query wirklich separat oder hängt da noch was dahinter (TDBGrid oder so).

4. Warum nehmt ihr ODBC statt ADO?
Heiko
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: FireDAC macht unendlich viele Fetches

  Alt 21. Apr 2020, 13:10
Hallo,
1. Und bei Eurem Server sind auch 30.000 Datensätze drin?

2. Ist euer interner Server der gleiche wie beim Kunden? (Versionsnummer usw.)

3. Ist die Query wirklich separat oder hängt da noch was dahinter (TDBGrid oder so).

4. Warum nehmt ihr ODBC statt ADO?
1. Ja. Ist eine Kopie der Datenbank.
2. Ja, gleiche BD verwendet, nur anderer Lizenzcode
3. Ist wirklich separat.
4. Weil Microsoft ADO und Native SQL abgekündigt hat und ODBC nun "the new holy grail" ist. Ich weiß, das war schon mal so und wird sich auch wieder ändern.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: FireDAC macht unendlich viele Fetches

  Alt 21. Apr 2020, 13:30
Hallo,
OK, zu Punkt 4 hast du da Infos?

Ich würde da trotzdem testweise mal eine AdoQuery drüberlaufen lassen.

Was mir noch einfällt wäre UniDirectional auf True setzen, falls es das Property dort gibt.


Ich denke übrigens nicht, dass es mit Server-Einstellungen zu tun hat,
sondern auf der Client-Seite etwas falsch/vermurkst eingestellt ist.
Heiko

Geändert von hoika (21. Apr 2020 um 13:36 Uhr)
  Mit Zitat antworten Zitat
jobo

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

AW: FireDAC macht unendlich viele Fetches

  Alt 21. Apr 2020, 17:27
Also wenn keine Subquery und kein datensensitives Delphi Element dranhängt, dann ist es merkwürdig.

Was mir einfällt, wäre evtl. ein Collation Problem wegen des Order By. Der Client hat vielleicht ein schräges Ländersetting.
Ich würde auf jedenfall sicherstellen, dass ein definierter Installationsablauf (DbClient/ODBC) auf einem Testgerät erfolgt.
Gruß, Jo
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#6

AW: FireDAC macht unendlich viele Fetches

  Alt 21. Apr 2020, 17:53
Hmm..

zu Punkt 4:
Nicht ganz richtig!!

Zwar sind der alte SQLOLDDB und die Native OLEs abgekündigt, jedoch gibt es seitens MS seit 2017 einen aktuellen OLE Treiber:

https://www.microsoft.com/de-de/down....aspx?id=56730

Dieser wird auch weiter entwickelt.


Quelle:
https://docs.microsoft.com/de-de/sql...l-server-ver15
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: FireDAC macht unendlich viele Fetches

  Alt 22. Apr 2020, 10:01
So, ich habe mal das ganze auf den SQL Native umgestellt.

Der Effekt ist dann wie weggeblasen. Muss es also etwas sein, mit dem ODBC nicht so 100% klar kommt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: FireDAC macht unendlich viele Fetches

  Alt 22. Apr 2020, 10:29
Hallo,
vielleicht ist bei den ODBC-Einstellungen irgendwas mit den lokalem Cache vermurkst worden.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: FireDAC macht unendlich viele Fetches

  Alt 22. Apr 2020, 10:41
Hallo. Danke fürs posten der Lösung.
Ich habe mit ODBC und MSSQL Server schon was ähnliches erlebt. Allerdings nur wenn man die gleiche Abfrage in der gleichen Query nochmal ausführt. Aus irgend einem Grund verdoppelt sich dann mit jedem Aufruf das übertragene Datenvolumen. Ich verwende da UniDac. DevArt meinte dazu das es an ODBC/ SQL Server liegt und man da nix machen kann. ...würde mich doch aber sehr wundern.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: FireDAC macht unendlich viele Fetches

  Alt 23. Apr 2020, 12:47
4. Weil Microsoft ADO und Native SQL abgekündigt hat und ODBC nun "the new holy grail" ist. Ich weiß, das war schon mal so und wird sich auch wieder ändern.
Das ist nicht ganz richtig. Der aktuell empfohlene Weg ist Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL) (siehe Microsoft OLE DB Driver for SQL Server), nicht zu verwechseln mit dem alten Microsoft OLE DB Provider for SQL Server (SQLOLEDB).

Der Microsoft ODBC Driver for SQL Server ist wieder was anderes.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:16 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