![]() |
Datenbank: Firebird • Version: 7 • Zugriff über: Zeos
Next; benötigt bei Zeos viel zu lange...
Hallo!
Ich habe ein großes Problem (welch Wunder :) ) Und Zwar habe ich eine Firebird-Datenbank auf die ich mittels Zeos zugreife. Jetzt habe ich das Problem dass wenn ich das Ergebniss einer Abfrage wie gewohnt mit
Delphi-Quellcode:
das Next bei etwa 180 Datensätzen entsetzliche 11 Sekunden Insgesamt benötigt.
Query.First;
while not EOF do begin //mach was Query.Next; end; Dass ist mir viel zu viel. Die Tabelle auf die er Zugreift hat folgende Felder: 7x Smalint 1x Bigint 1x Varchar(255) 1x blob sub_type 0 In den Blob werden auch nur momentan ca 40Byte rein gespeichert. Noch als Info: Ich nutze Lazarus. Jetzt ist meine frage: was kann ich verbessern? Warum braucht das next so lange? (alles andere benötigt nur wenige ms) Liegt das an dem Blob? (ist mein erstes ^^) Gruß Teekeks |
AW: Next; benötigt bei Zeos viel zu lange...
Wird es schneller, wenn Du das BLOB-Feld einmal in der Abfrage weglässt?
|
AW: Next; benötigt bei Zeos viel zu lange...
Werden insgesamt oder in jeden Blob 40GB geschrieben?:shock: Auf jeden Fall wäre bei dieser Datenmenge ein Index für die Tabelle keine schlechte Idee ;-)
|
AW: Next; benötigt bei Zeos viel zu lange...
@Heiko: nur 40 Byte nicht GigaByte ^^
@DeddyH: Ja, Tatsächlich... Aber: ich benötige dieses Blob. Was läuft da falsch? Ich habe das Gefühl das wir der Sache näher kommen... :) |
AW: Next; benötigt bei Zeos viel zu lange...
Die Frage ist: brauchst Du zur Abfragezeit wirklich alle BLOBS? Falls Du diese in einem DBGrid anzeigst, dann doch sicher nicht. In dem Falle würde ich das BLOB-Feld von der Abfrage ausschließen und erst bei Bedarf (Anzeige der Detaildaten) abfragen.
|
AW: Next; benötigt bei Zeos viel zu lange...
Ich zeige das ganze nicht in einem DB-Grid dar, sondern verarbeite dabei diese selber von Hand.
Und ich benötige dabei wirklich alle Blobs (ist ja auch nur eines pro Datensatz, dass sollte nun wirklich mal möglich sein bei einem so mächtigen System mal eben 40 Byte je Datensatz zu lesen, selbst mein VarChar ist da größer...). |
AW: Next; benötigt bei Zeos viel zu lange...
Ich hab mir mal sagen lassen, daß für BLOBs ziemlich viel Treibergymnastik notwendig ist.
(Langsam aber geht) Muß es denn ein BLOB sein? Gruß K-H |
AW: Next; benötigt bei Zeos viel zu lange...
Also wenn es nur (fest) 40 Bytes sind, dann würde ich ein VARCHAR(40) nehmen, welches Case-Sensitive ist. Dann hast du deine 40 Zeichen und die Abfrage sollte sich wesentlich beschleunigen.
Bernhard |
AW: Next; benötigt bei Zeos viel zu lange...
Hallo, schon einmal danke für eure Hilfe.
Nein, es ist halt leider nicht Konstant 40 Byte. Konkret ist es ein Variabler Text mit eigenen Formations-Einheiten. Bei MySQL gibt es ja den Feldtyp Text, der würde gehen. Das Problem ist das ein beliebig langer "Text" gespeichert werden soll. Gibt es denn da einen entsprechenden Typen in Firebird? Gruß Teekeks |
AW: Next; benötigt bei Zeos viel zu lange...
Hallo,
Schau mal hier: ![]() Zitat:
Eventuell geht das schneller. |
AW: Next; benötigt bei Zeos viel zu lange...
Aha, Ich habe das jetzt mal auf sub_type 1 umgestellt.
Das Ergebnis ist: jetzt ist es etwa doppelt so schnell. Problem: inzwischen sind es aber auch doppelt so viele Datensätze geworden. Es sollen zum Schluss etwa 1000 in annehmbarer Geschwindigkeit angezeigt werden. Momentan sind es 300 bei 13 Sekunden. Gibt es noch andere Methoden? Diese ist ja schon mal viel besser, also schon einmal danke bis hier her. |
AW: Next; benötigt bei Zeos viel zu lange...
Vielleicht liegt es auch an Zeos, ich würde mal
![]() probieren. Kosten zwar, allerdings funktionieren sie auch gut. Gruß Günter |
AW: Next; benötigt bei Zeos viel zu lange...
Ich habe beim Traversieren inbes. bei der Alpha 7 von Zeos auch einige Geschwindigkeitseinbrüche festgestellt. Bei vielen bzw. großen Datensätzen war das schon beachtlich.
Abhilfe schaffte folgende Konstruktion:
Delphi-Quellcode:
Ich hatte zwar MySQL verwendet, aber vielleicht bringt Das ja bei Dir ja auch etwas...
var
R: IZResultSet; MyInt: Integer; begin with ZQuery do begin Open; R := DbcResultSet; R.BeforeFirst; while R.Next do begin MyInt := R.GetIntByName('IntegerField'); end; end; end; |
AW: Next; benötigt bei Zeos viel zu lange...
Hallo mirage228!
Deine Methode hat immerhin schon mal bewirkt das der nur noch halb so lange benötigt. Ich habe mich dann jetzt auf ein varchar(4000) geeinigt. Damit sollte ich genug platz haben und es ist schön schnell (308 Datensätze= 800ms) Danke an euch alle für eure Hilfe! |
AW: Next; benötigt bei Zeos viel zu lange...
Brauchst du den immer den Inhalt der Blobs, oder wäre es eine Option diese on demand nachzuladen?
|
AW: Next; benötigt bei Zeos viel zu lange...
Leider benötige ich den wirklich immer.
Ist aber in Ordnung da ich ein Varchar jetzt als Blob missbrauche :) Das ist zwar nicht sehr schön, funktioniert aber hervorragend :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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