![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Firebird Leistung Index Max
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen alle...
Ich hätte da gern mal ein Verständnisproblem... 8-) Gegebenheiten: Tabelle mit 21 Mio Datensätzen
Delphi-Quellcode:
Indizies
CREATE TABLE T_RECORD_DATA (
F_PARAMETER_ID ID /* ID = INTEGER NOT NULL */, F_TIMESTAMP_UNIX INTEGER_NORMAL /* INTEGER_NORMAL = INTEGER NOT NULL */, F_POWER_STATE INTEGER_NORMAL /* INTEGER_NORMAL = INTEGER NOT NULL */, F_VALUE STRING10 /* STRING10 = VARCHAR(10) NOT NULL */
Delphi-Quellcode:
... alle Datensätze bei bestehendem Index eingefügt.
ALTER TABLE T_RECORD_DATA ADD CONSTRAINT FK_T_RECORD_DATA_1 FOREIGN KEY (F_PARAMETER_ID) REFERENCES T_DEVICE_PARAMETERS (ID) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE INDEX T_RECORD_DATA_IDX1 ON T_RECORD_DATA (F_TIMESTAMP_UNIX); SQL
Delphi-Quellcode:
Problem:
select first 10 * from T_RECORD_DATA where F_timestamp_unix = (select max(F_timestamp_unix) from t_record_data)
Ausführungszeit = 36s 926ms ... absolut inakzeptabel :roll: Leistungsanalyse: siehe Bild und
Delphi-Quellcode:
Die Frage:
------ Leistungsinformation ------
Prepare time = 31ms Ausführungszeit = 36s 926ms Avg fetch time = 3.692,60 ms Current memory = 17.699.664 Max memory = 17.901.376 Memory buffers = 1.024 Reads from disk to cache = 82.953 Writes from cache to disk = 0 Fetches from cache = 43.527.070 Warum greift der Index nicht? Wo ist der Denkfehler? |
AW: Firebird Leistung Index IBExpert
Wie sieht der PLAN aus?
Wie ändert sich das Ergebnis wenn die Abfrage auf zwei Statements aufgeteilt wird?
Code:
1. select max(F_timestamp_unix) from t_record_data)
2. select first 10 from T_RECORD_DATA where F_timestamp_unix = :F_timestamp_unix_aus_1 |
AW: Firebird Leistung Index IBExpert
Danke... :wink:
Sooo... SQL mit festem Wert
Delphi-Quellcode:
select first 10 * from T_RECORD_DATA where F_timestamp_unix = 1398999942
Delphi-Quellcode:
SQL Max
------ Leistungsinformation ------
Prepare time = 31ms Ausführungszeit = 0ms Avg fetch time = 0,00 ms Current memory = 17.733.168 Max memory = 18.122.312 Memory buffers = 1.024 Reads from disk to cache = 0 Writes from cache to disk = 0 Fetches from cache = 27
Delphi-Quellcode:
select max(F_timestamp_unix) from t_record_data
Delphi-Quellcode:
Also der Flaschenhals wäre gefunden. :shock: Da müßte aber der Index doch auch greifen oder?
------ Leistungsinformation ------
Prepare time = 31ms Ausführungszeit = 41s 559ms Avg fetch time = 41.559,00 ms Current memory = 17.726.240 Max memory = 18.122.312 Memory buffers = 1.024 Reads from disk to cache = 82.949 Writes from cache to disk = 0 Fetches from cache = 43.527.043 |
AW: Firebird Leistung Index IBExpert
Ich hab keine Ahnung wie/ob Firebird irgendwas Richtung Statistikanalyse macht.
Wenn ja, vielleicht nicht fertig geworden vor der ersten Abfrage, also im weitesten Sinne falsche, schlechte Statistiken. Wenn nein, wenn die Werte in order of appearance in den Indexaufbau gehen ("bei bestehendem Index eingefügt.."), kann je nach internen Verfahren ein "schlechter " Index entstehen. Unabhängig von allem zuvor genannten kann einfach der Inhalt des Feldes ungeeignet sein, viele gleiche Werte, sodass am Ende ein Fullscan daraus wird. Da Du "select top 10" machst, scheint ja allein das Maximum schon relativ häufig vorhanden zu sein, so dass Du es einschränkst. Oder erhoffst Du Dir davon einfach nur den Server etwas zu schonen? |
AW: Firebird Leistung Index IBExpert
Zitat:
Das ist schon mal was, aber kein Ausführungsplan. |
AW: Firebird Leistung Index IBExpert
Danke an alle erst mal. :wink:
Gerade gefunden: ![]() Zitat:
Nach der Änderung und Neuberechnung des Index: SQL
Delphi-Quellcode:
select max(F_timestamp_unix) from t_record_data
Delphi-Quellcode:
:shock: Das hat mich einen ganzen Tag gekostet.
------ Leistungsinformation ------
Prepare time = 31ms Ausführungszeit = 0ms Avg fetch time = 0,00 ms Current memory = 17.897.528 Max memory = 70.260.896 Memory buffers = 1.024 Reads from disk to cache = 5 Writes from cache to disk = 0 Fetches from cache = 9 Danke für die Tipps zum Brille putzen. :thumb: Zitat:
|
AW: Firebird Leistung Index Max
Ginge es nicht auch so (ob das dann schneller wäre ist eine andere Frage):
Code:
select first 1 skip ((select count(*)-1 from T_RECORD_DATA)) F_timestamp_unix from T_RECORD_DATA order by F_timestamp_unix
|
AW: Firebird Leistung Index Max
Zitat:
|
AW: Firebird Leistung Index Max
Firebird hat keine bi-direktionalen Indizes, darum brauchst du einen DESCENDING Index um ein MAX daraus bedienen zu können.
|
AW: Firebird Leistung Index Max
Das hab ich auch nun schmerzlich festgestellt. :P
Für MIN gilt natürlich das ganze umgekehrt. Wie sieht die Konstellation für COUNT aus? Welche Variante greift da am besten? Der IBExpert zählt sich immer einen Wolf wenn ich mal zählen lasse. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04: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-2025 by Thomas Breitkreuz