![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Firebird: letzte 10 Datensätze ausgeben zu langsam
Hallo zusammen,
mit diesem SQL – Abfrage will ich die letzten 10 Datensätze ausgeben:
Code:
Allerdings dauert die Abfrage viel zu lange:
select first 10 * from mw_tabelle order by mw_id desc
Auszug IB–Expert: Plan: PLAN SORT ((MW_TABELLE NATURAL)) ------ Performance info ------ Prepare time = 16ms Execute time = 16m 18s 79ms Avg fetch time = 97.807,90 ms Current memory = 13.623.656 Max memory = 133.137.376 Memory buffers = 3.000 Reads from disk to cache = 1.212.301 Writes from cache to disk = 0 Fetches from cache = 225.260.875 Meine Frage ist, gibt es eine Möglichkeit diese Abfrage zu beschleunigen? Bis bald Chemiker |
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Gibt's 'nen absteigenden Index auf mw_id?
|
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Zitat:
|
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Habe mal auf die Schnelle eine Procedure geschrieben, mit der man die IDs der letzten 10 Datensätze schnell ermitteln kann:
Delphi-Quellcode:
Die Procedure liefert die beiden Werte bmin und bmax.
SET TERM ^ ;
create or alter procedure p_last10 returns ( bmin integer, bmax integer) as declare variable c integer; declare variable maxl integer; declare variable btemp integer; begin c=1; select max(buch_nr) from buchungen into :bmax; bmin=bmax; maxl=0; while ((c<10) and (maxl<100)) do begin select max(buch_nr) from buchungen where buch_nr<:bmin into :btemp; if (not btemp is null) then begin c=c+1; bmin=btemp; end maxl=maxl+1; end suspend; end ^ SET TERM ; ^ Maxl soll Verhindern, dass die Procedure in einer Endlosschleife hängenbleibt, wenn keine 10 Datensätze gefunden werden (ungetestet). Dann braucht man nur noch den Select mit den beiden Parametern aus der Procedure ausführen. Bei mir select * from buchungen where buch_nr between :s and :t |
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Wie schnell ist denn
SQL-Code:
Gruß
select first 10 mw_id from mw_tabelle order by mw_id desc
K-H |
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Zitat:
|
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Hallo,
ich habe einen absteigenden Index angelegt mit:
Code:
anschließend noch mal die Abfrage aufgerufen:
CREATE DESCENDING INDEX AB_MW_ID ON MW_TABELLE (MW_ID)
Code:
IB-Expert:
select first 10 * from mw_tabelle order by mw_id desc
Plan: PLAN (MW_TABELLE ORDER AB_MW_ID) ------ Performance info ------ Prepare time = 16ms Execute time = 0ms Avg fetch time = 0,00 ms Current memory = 13.602.268 Max memory = 13.638.264 Memory buffers = 3.000 Reads from disk to cache = 0 Writes from cache to disk = 0 Fetches from cache = 1.304 Ich hätte nicht gedacht, dass der Unterschied so groß ist, weil auf dem Feld mw_id auch der primäre Index liegt. Was ich nicht verstehe ist, wie Firebird unterscheidet welcher Index genommen werden soll. Bis bald Chemiker |
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Zitat:
|
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Zitat:
2. max() wird beschleunigt durch einen descending index 3. min() wird beschleunigt durch einen ascending index 4. sollten zusätzliche Bedingungen existieren, wie zB < oder = oder >, dann können beide Indextypen helfen 5. order by sorgt ggf. auch für indexbenutzung, sofern passende reihenfolge, muss aber nicht unbedingt vorteilhaft sein 6. Welcher Index von mehreren gleichwertigen zuerst genommen wird, entscheidet firebird mit Hilfe der Index Statistik, der sozusagen der Kehrwert der Eindeutigkeit darstellt (=Selektivität) 7. pro SQL kann Firebird pro Tabelle mehr als einen Index benutzen, weil Zwischenergebnisse der rdb$db_keys aus den Indizes übereinander gelegt werden Die Infos aus 6. und 7. erfordern aber schon ein wenig Basiskenntnisse über Firebird und der Architektur dahinter, unötige Indizes oder unbrauchbare mit mieser Selektivität oder kombinierte Indizes mit unbrauchbarer Feldreihenfolge machen ggf. SQL Abfragen langsamer als man denkt. Wir haben schon so manche Abfrage durch löschen oder austricksen von Indizes beschleunigt, gibt aber nicht unbedingt irgendwelche immergültigen Bauernregeln ... |
AW: Firebird: letzte 10 Datensätze ausgeben zu langsam
Ach ja, und bei IBExpert > Personal Edition gibt es auch die Seite Performance Analysis beim SQL Editor eine Übersicht, wie viele Operation auf jeder Tabelle durchgeführt wurde
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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