AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird SELECT BETWEEN etxrem langsam
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird SELECT BETWEEN etxrem langsam

Ein Thema von mlc42 · begonnen am 9. Feb 2013 · letzter Beitrag vom 9. Feb 2013
Antwort Antwort
mlc42

Registriert seit: 9. Feb 2013
123 Beiträge
 
#1

Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 13:33
Datenbank: Firebird • Version: 2.52 • Zugriff über: FlameRobin,AnyDAC
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
  Mit Zitat antworten Zitat
jobo

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

AW: Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 14:00
Welchen Typ hat das Datumsfeld?
Falls es nicht String ist, dürfte der Index für den Datumsteil hier nutzlos sein.
Gruß, Jo
  Mit Zitat antworten Zitat
mlc42

Registriert seit: 9. Feb 2013
123 Beiträge
 
#3

AW: Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 14:37
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
  Mit Zitat antworten Zitat
jobo

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

AW: Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 15:19
Das Datum ist timestamp die anderen Felder sind Int.
Dann solltest Du entweder explizit Deinen Datums-String in Timestamp konvertieren oder in Delphi - falls Du es von dort aufrufst- mit Parametern und natürlich den richtigen Typen arbeiten.
Wenn ich nur die ID Abfrage auf = ändere und Datum auf BETWEEN lasse geht es auch schon schnell.
Hier dürfte durch die Gleichheitsprüfung die Ergebnismenge auf einen Schlag so stark eingeschränkt sein, das der Rest vom Verarbeitungsaufwand nicht ins Gewicht fällt, Egal wie schlecht oder aufwändig die Abfrage da noch gestaltet ist.
Ich weiß ja nicht wie Firebird das intern speichert
Du hast alle benötigten Typinformationen (hast Du oben geschrieben), was Firebird intern macht, weiß ich auch nicht, kann, soll, muss ich auch nicht, genau wie Du.

Also schau Dich um, wie man Abfragen parametrisiert, den Parametertyp setzt und ab die Post...
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
646 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 15:34
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
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
mlc42

Registriert seit: 9. Feb 2013
123 Beiträge
 
#6

AW: Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 17:50
@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.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Firebird SELECT BETWEEN etxrem langsam

  Alt 9. Feb 2013, 19:43
Firebird sieht nicht, das die untere und obere Grenze der ID beim BETWEEN identisch ist, ganz einfach.
  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 23:38 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