![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: DISQLite3
BETWEEN schneller machen?
Moin,
ich hab hier ein SELECT stmt welches eindeutig zu langsam ist (bei 800MHZ 1249ms). Derzeit benutze ich in diesem stmt BETWEEN um meine Daten zu bekommen. Das Ergebnis ist zwar wie gewünscht aber es dauert zu lang.
SQL-Code:
Ich hab hier mal einen Schlüssel eingefügt um zu verdeutlichen wie die aussehen ;)
SELECT fgstnr_prod, fgstnr_mospid, fgstnr_typschl FROM vin_fgstnr WHERE "EH03029" BETWEEN fgstnr_von AND fgstnr_bis
Zur Tabelle: Im stmt sind schon fast alle Spalten drin. Eine gibts noch die ich derzeit nicht verwende: fgstnr_anf Die enthält die ersten beiden zeichen des Schlüssels. Die Tabelle enthält um 1.5 mio Datensätze. Nun suche ich nach einer Möglichkeit die Daten schneller zu filtern. Wenn ich nur nach fgstnr_anf Frage bekomme ich um 1000 Datensätze. Wäre es besser das Query darüber aufzubauen und dann mit Delphi die Daten zu Filtern? Wenn ja wie finde ich den passenden Datensatz? Da es sich bei den Schlüsseln immer um einen Bereich handelt. Gibt es noch andere alternativen? |
Re: BETWEEN schneller machen?
Was für Indizes existieren?
|
Re: BETWEEN schneller machen?
Derzeit keine.
Gibt auch keine Unique Felder. |
Re: BETWEEN schneller machen?
Indizes sind aber das Instrument der Wahl um Abfragen zu optimieren.
|
Re: BETWEEN schneller machen?
Zitat:
Gruss KH |
Re: BETWEEN schneller machen?
Der Index sollte dann für _von und _bis sein oder?
Muss ich an der Abfrage noch etwas verändern? |
Re: BETWEEN schneller machen?
Zitat:
|
Re: BETWEEN schneller machen?
Zitat:
|
Re: BETWEEN schneller machen?
Den Index hab ich nun mal erstellt aber wirklich geändert hat sich nichts an er Geschwindigkeit :?
SQL-Code:
CREATE INDEX [IDX_VIN_FGSTNR_] ON [vin_fgstnr](
[fgstnr_von] ASC, [fgstnr_bis] ASC ) |
Re: BETWEEN schneller machen?
Lege probeweise mal zwei Indizes an, einen für jede Spalte.
|
Re: BETWEEN schneller machen?
Richtig, so gilt er ja für die Kombination der beiden Spalten.
|
Re: BETWEEN schneller machen?
Auch keine Besserung :(
Eher schlechter... Abfragezeit liegt nun bei 2245ms |
Re: BETWEEN schneller machen?
Zitat:
hast die abfrage mal direkt in der DB gemacht? |
Re: BETWEEN schneller machen?
Zur Zeitprüfung nutze ich SQLiteAdmin da es ja kein direktes Interfcae für SQLite gibt.
|
Re: BETWEEN schneller machen?
Zitat:
|
Re: BETWEEN schneller machen?
Mit Index: 749ms
Ohne Index: 561ms :gruebel: Beides Durchschnitt aus 3 gesendeten Abfragen. :wiejetzt: Verwendetes Qry:
SQL-Code:
SELECT fgstnr_mospid FROM vin_fgstnr WHERE "EW03029" BETWEEN fgstnr_von AND fgstnr_bis
|
Re: BETWEEN schneller machen?
Komisch :gruebel:
|
Re: BETWEEN schneller machen?
Dann löse doch mal BETWEEN in Einzelbedingungen auf.
Wäre ja möglich, dass der Query Analyser von SQLite nicht schlau genug ist, um die Anwendung von Indizes zu erkennen:
SQL-Code:
SELECT fgstnr_mospid FROM vin_fgstnr WHERE (fgstnr_von <= 'EW03029') AND (fgstnr_bis >= 'EW03029')
|
Re: BETWEEN schneller machen?
Keine Änderung durch die Auflösung...
Die höheren Geschwindigkeiten bei den einzelnen Spalten (wie oben angegeben) Resultieren daraus das ich grad auf höherer Geschwindigkeit arbeite. Bei 800MHZ sind die Geschwindigkeiten so: mit 3869ms ohne 1560ms Bei Aufgelöstem Qry: mit 2574ms ohne 1607ms :( |
Re: BETWEEN schneller machen?
Zitat:
hat du die Möglichkeit die Daten zum Test in eine andere DB zu importieren und die Abfrage dort auszuführen? |
Re: BETWEEN schneller machen?
Was für eine Festplatte verwendest du in einem 800Mhz-Rechner? SQLite cached wenig im RAM, wenn deine DB da eine gewisse Größe erreicht, wird schnell die Festplatte zum merkbaren Flaschenhals.
|
Re: BETWEEN schneller machen?
Zitat:
|
Re: BETWEEN schneller machen?
A) Entweder SQLite ist doch nicht so toll, oder
B) die Messreihenfolge hat Auswirkungen auf das Ergebnis (Cache). Für A: Prüf mal, indem Du die Query umschreibst (Siehe Post von sx2008). Wenn das dann schneller geht, ist SQLite zu 'lite', um beim BETWEEN einen Index zu verwenden. Für B: Vertausche die Messreihenfolge in deinem Testprogramm. Wenn das dann schneller geht, weißt Du Bescheid :zwinker: |
Re: BETWEEN schneller machen?
Zitat:
Auch würde ich versuchen die letzte Version (Version 3.6.11) einzusetzen. In der ![]() |
Re: BETWEEN schneller machen?
SQLite Admin basiert auf den ZEOS Komponenten.
Als Festplatte steck hier im Laptop eine SATA2 Festplatte. Ist zwar eher mittelmaß aber ausreichend. Das Problem liegt auch genau bei diesem Query. Wenn ich nur nach _mospid oder _tyschl Abfrage geht das ganze unter 500ms bei 800MHZ Deswegen hatte ich überlegt ob es nicht besser wäre über Delphi Code die passende Range zu suchen. Da die Abfrage über _anf wesentlich schneller ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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