![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IB
Wie langsam ist Firebird über Internet wirklich?
Hi@all!
Ich weiß, dass es schon einige Themen zu Firebird und der Geschwindigkeit im Netzwerk gibt und dass Firebird bzw Interbase ziemlich viele kleine Datenpakete schickt, weshalb die Engine im Internet langsamer wird. Ich habe hier ein Programm, das in der Firebird-DB ca 40 Abfragen macht. Dafür braucht das Programm 20 Sekunden übers Internet. Im Netzwerk geschieht die Abfrage nahezu sofort. der Code sieht ungefähr so aus:
Delphi-Quellcode:
Dieser Code wird eben 40 mal aufgerufen. Ist dieser Code irgendwie sehr unperformant? Oder ist Firebird wirklich so extrem langsam über das Internet?
function TDataBaseConnection.IsDocumentInDB(CustomerID:integer;EMailDate:tDateTime):boolean;
var table: TIBTable; ta: TIBTransaction; begin ta:=TIBTransaction.Create(nil); ta.DefaultDatabase:=DB; ta.Params.Add('read'); table:=TIBTable.Create(nil); table.database:=DB; table.Transaction:=ta; table.TableName:='DOCUMENTS'; table.filter:='CUSTOMER = '''+inttostr(CustomerID)+''' AND MODIFYDATE = '''+DateTimetoStr(EMailDate)+''''; table.Filtered:=true; table.Open; result:=(table.RecordCount>0); table.Close; freeandnil(table); freeandnil(ta); end; Gibt es andere DB's die die Aufgabe schneller erfüllen können (und wenn irgendwie möglich über TIBDatabase angesteuert werden können?) Gruß und besten Dank, Michael |
AW: Wie langsam ist Firebird über Internet wirklich?
Ich würde mir angewohnen, dass man eine Art Profiling/Monitoring/Tracing verwendet, wenn es um Performanzthemen geht, damit man weiss, was der eigene Code so "verbricht".
Dein Code ist sehr Desktop-DB belastet. Kenn jetzt nicht die Implementierung im Hintergrund von IBX, aber ich könnte mir vorstellen, dass bei Verwendung von TIBTable/Filter/RecordCount im Worst-Case alle Datensätze zum Client transferiert werden. Du willst ja im Wesentlichen überprüfen, ob basierend auf einem Filterkriterium, Datensätze existieren. Das kann mit SQL in einem SELECT gemacht werden, was dann am Server ausgeführt wird und letztendlich nur ein einzelner Wert zum Client übertragen wird. Ja, Firebird's Remote-Protokoll ist geschwätzig und übers WAN weniger geeignet, aber in deinem Code steckt bei Verwendung einer Client/Server-Datenbank viel Verbesserungspotential. Kommst du von einem Desktop-DB Background (Paradox, dBase, ...)? |
AW: Wie langsam ist Firebird über Internet wirklich?
Ne, ich habe nicht sehr viel Ahnung von Datenbanken im Allgemeinen und bin eher bei normaler Pascal-Programmierung zu Hause. Habe mir einfach über das Internet die entsprechenden Informationen zusammengesucht, um die Funktion zu schreiben. An anderen Stellen gehen ich auch über TDatasets, in denen ich mir die SQLInsert,Modify etc selber generiere. Aber auch die sind entsprechend langsam über WAN. Ist TIBTable sehr langsam? Allerdings sind in der entsprechenden Tabelle nur 5 Einträge gespeichert.
|
AW: Wie langsam ist Firebird über Internet wirklich?
Das schreit doch förmlich nach einer Stored Procedure oder einer View.
|
AW: Wie langsam ist Firebird über Internet wirklich?
Zitat:
|
AW: Wie langsam ist Firebird über Internet wirklich?
Zitat:
@tSteinmaurer Keine Ahnung zu haben ist immer schlecht, aber ich versuche dies gerade zu ändern. ;) Danke für den Hinweis mit tibtable. Ruft das Teil immer die ganze Tabelle ab? |
AW: Wie langsam ist Firebird über Internet wirklich?
Zitat:
|
AW: Wie langsam ist Firebird über Internet wirklich?
Zitat:
|
AW: Wie langsam ist Firebird über Internet wirklich?
Mit einer Query sieht das ganz grob so aus:
Delphi-Quellcode:
Das lässt sich mit Parametern noch verbessern sollte so aber auch funktionieren.
query.SQL.Text := 'SELECT COUNT(*) AS Anzahl FROM DOCUMENTS';
query.SQL.Add('WHERE CUSTOMER = '+QuotedStr(inttostr(CustomerID))+' AND MODIFYDATE = '+QuotedStr(DateTimetoStr)); ShowMessage(query.SQL.Text); // zum Debuggen die SQL-Abfrage anzeigen query.open; result := query.Fields[0].AsInteger <> 0; |
AW: Wie langsam ist Firebird über Internet wirklich?
Hi,
als Jeff Overcash die IBX vor über 10 Jahren veröffentlicht hat, hat er auch 2 Dinge klar gestellt: 1. TIBTable ist lediglich für die Abwärtskompatibilität da, d.h. sollte nur für Umstellungen (d.h. von DBase, Paradox usw. nach Interbase) verwendet werden und dann durch TIBQuery oder TIBDataSet ersetzt werden 2. IBX werden Firebird nicht unterstützen. Die IBX funktionieren zwar meistens mit Firebird, aber es wird halt nicht offiziell unterstützt, d.h. kann auf Besonderheiten nicht eingehen. Wenn es dir nur mal um den GEschwindigkeitsunterschied geht, nimm mal die UIB, bzw. wenn es später um "einfache" Datenbankanwendungen geht (d.h. Datenbank-Query-Datasouce-DBKomponente) dann auch die kommerziellen FIBplus oder IBDAC (gibts sicherlich auch Testversionen von denen). Die funktionieren auch mit den aktuellen Firebird-Versionen ohne "Tricks". Wenn Du bei Firebird bleiben willst, gibts eine einfache Möglichkeit die Performance rasant zu steigern: Übertrag die Abfrage als Text auf einen "Anwendungsserver" der im lokalen Netz beim FBServer steht (oder direkt auf der selben Maschine läuft), führ die Abfrage dann dort "lokal" aus und übertrag das Ergebnis wiederum per TCP/IP Verbindung an den eigentlichen Client. Dazu hat sich auch mal einer Gedanken gemacht und ein Framework geschrieben, das find ich aber auf die schnelle nicht, oder doch: ![]() da gehts zwar gleich um Objekte, aber auf eine vergleichbare Art und weise kannst Du ja auch ein Abfrageergebnis übertragen... GRüße Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz