![]() |
Datenbank: Firebird • Version: 2.52 • Zugriff über: FlameRobin,AnyDAC
Firebird SELECT BETWEEN etxrem langsam
Hallo,
ich habe ein seltsames Verhalten bei Firebird entdeckt. Abfragen mit BETWEEN sind teilweise unglaublich langsam. Beispiel Tabelle mit einigen 100.000 Datensätzen Felder (ID,DATUM,NUMMER,....) Sekundärer Index auf ID,DATUM,NUMMER ist gesetzt SELECT * FROM tabelle WHERE (ID BETWEEN 1000 AND 1000) AND (DATUM BETWEEN '01.01.2013' AND '01.01.2013') ORDER BY ID,DATUM,NUMMER Dieser SQL dauert um die 9 Sekunden und liefert in meinen Daten ca. 8 Datensätze zurück. Laut Plan nimmt Firebird den INDEX ID,DATUM,NUMMER. Die Platte hört sich aber so an als wenn er mehr macht. Flamerobin zeigt 70.000 Fetches an. SELECT * FROM tabelle WHERE (ID = 1000) AND (DATUM = '01.01.2013') ORDER BY ID,DATUM,NUMMER (Was in diesem Fall geht da die Grenzen gleich sind) Dieser SQL dauert 0,09 Sekunden. Festplatten Cache, Firebird Cache habe ich vor jedem Test geleert. Sonst merkt man das nicht. Der gleiche SQL wird in meinem Programm auch auf einen MS-SQL Server abgesetzt. Da ist es immer sehr schnell. Ich habe das bei mir so in ANYDAC geändert, das BETWEEN mit gleichen Grenzen durch = ersetzt wird. Dann funktioniert mein Programm auch auf Firebird so schnell wie man das bei dieser einfachen Afrage erwarten sollte. Kennt jemand die Ursache für dieses Verhalten ? mfg Martin |
AW: Firebird SELECT BETWEEN etxrem langsam
Welchen Typ hat das Datumsfeld?
Falls es nicht String ist, dürfte der Index für den Datumsteil hier nutzlos sein. |
AW: Firebird SELECT BETWEEN etxrem langsam
Das Datum ist timestamp die anderen Felder sind Int.
Wenn ich nur die ID Abfrage auf = ändere und Datum auf BETWEEN lasse geht es auch schon schnell. Ich weiß ja nicht wie Firebird das intern speichert, Aber in Delphi ist das ja ein Float und der ist ja auch aufsteigend sortiert. Gruß Martin |
AW: Firebird SELECT BETWEEN etxrem langsam
Zitat:
Zitat:
Zitat:
Also schau Dich um, wie man Abfragen parametrisiert, den Parametertyp setzt und ab die Post... |
AW: Firebird SELECT BETWEEN etxrem langsam
nimm mal 3 Einzelindizes für die felder statt einem kombinierten index, den am besten löschen.
Bei deiner Abfrage mit den Betweens hast du ab dem ersten Eintrag keine sinnvolle Wirkung mehr für deinen kombinierten Index |
AW: Firebird SELECT BETWEEN etxrem langsam
@jobo
Die Abfrage wird innerhalb ANYDac erzeugt und arbeitet mit Parametern. Das mit dem Beispiel habe ich dann nur gemacht um das ganz einfach prüfen zu können. Es macht aber keinen Unterschied. Über den ID Index sind es ca. 7000 Datensätze. Bei der Between Abfrage kommt ja die gleiche Menge raus. Über den Index kann er ja auch da unmittelbar im Index aufsetzen. Es ist schon seltsam. Bei Paradox setzt so ein Range ja einfach den Zeiger auf den ersten passenden ID,DATUM und gibt dann an Hand des Schlüssels solange Datensätze aus bis es halt nicht mehr passt. Der MS-SQL Server macht das auch blitzschnell. @IBExpert Warum hat der kombinierte Index bei Between keine Wirkung mehr ? Wie soll Firebird das sonst schnell sortieren oder suchen können ? Kombinierte Indices sind ja schon notwendig. Ich werd mal probieren wie das dann aussieht. |
AW: Firebird SELECT BETWEEN etxrem langsam
Firebird sieht nicht, das die untere und obere Grenze der ID beim BETWEEN identisch ist, ganz einfach.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 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-2025 by Thomas Breitkreuz