![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: IBExpert
Merkwürdikeit bei Select max(id) from..
Hallo,
ich habe zum Testen der Performance eine Testtabelle entworfen die 15.000.000 Datensätze enthält. AR ist die ID und der PrimaryKey Dabei habe ich folgende überaschende Merkwürdogkeit entdeckt:
SQL-Code:
liefert innerhalb von ca. einer 10-tel sec die richtigen Werte zurück
Select * FROM ROHWERTE
where ar between 14000000 and 14000010 unter Verwendung folgenden Plans: (lt. IBExpert) Plan PLAN (ROHWERTE INDEX (PK_ROHWERTE)) Adapted Plan PLAN (ROHWERTE INDEX (PK_ROHWERTE)) während das hier:
SQL-Code:
unter Verwendung folgenden Plans ca 2min braucht:
Select max(ar) FROM ROHWERTE
Plan PLAN (ROHWERTE NATURAL) Adapted Plan PLAN (ROHWERTE NATURAL) Was könnte dafür die Ursache sein und wie kann man das Umschiffen? Viele Grüsse wo |
Re: Merkwürdikeit bei Select max(id) from..
Es gibt ja kein Index für den Maxwert, sondern nur für die Werte, deshalb scheint diese Abfrage ohne den Index ausgeführt zu werden. Versuch mal
SQL-Code:
select first 1 id from rohwerte desc;
|
Re: Merkwürdikeit bei Select max(id) from..
Zitat:
|
Re: Merkwürdikeit bei Select max(id) from..
Zitat:
|
Re: Merkwürdikeit bei Select max(id) from..
Zitat:
PLAN (ROHWERTE NATURAL) |
Re: Merkwürdikeit bei Select max(id) from..
Hallo,
gemeint war:
SQL-Code:
Grüße vom marabu
select first 1 ar from rohwerte order by ar desc
|
Re: Merkwürdikeit bei Select max(id) from..
Hab das hier mit FB2 getestet (Tabelle hatte nur 214 T Einträge ging problemlos.
|
Re: Merkwürdikeit bei Select max(id) from..
@Marabu:
SQL-Code:
funktioniert so zwar prinzipiell, aber der Query-Plan bleibt wie gehabt
select first 1 ar from rohwerte order by ar desc
@mkinzler: Ich werdemal die Datenbank auf FB2 umstellen, das dauert bei der Menge allerdings eine Weile Ich werde dann hier weiter berichten. mfg wo |
Re: Merkwürdikeit bei Select max(id) from..
Welche 1.5x hast du denn?
Eine Migration auf die 2er ist aber unabhängig davon ratsam |
Re: Merkwürdikeit bei Select max(id) from..
Server version: WI-V6.3.4.4910 Firebird 1.5
Der Backup ist auch gleich fertig, und ich stelle dann auf 2.0 Realease um. An der Stelle frag ich mich nur noch wenn das besser/richtig funktioniert welche Zugriffskomponeten ich dann in Delphi nehmen soll, da ich den FB1.5 ja wegen der (noch vorhandenen) Kombapilität zu dem Interbase-Kombos von Delphi ausgewählt hatte.. |
Re: Merkwürdikeit bei Select max(id) from..
Diese Kompatibilität gilt auch für FB2. Allerdings weiß man nicht wie lange noch. Alternativen wären
IBDAC, FIBplus, Zeos, UIB, MDO, ... |
Re: Merkwürdikeit bei Select max(id) from..
Hallo,
jetzt hab ich folgenden Server : Server version: WI-V6.3.1.12855 Firebird 2.0 und diesen IBExpert: Version 2007.07.20 Leider verwendet der immernoch den PLAN SORT ((ROHWERTE NATURAL)) Besteht die Möglichkeit, das noch irgendwas anderes da Einwirken könnte? |
Re: Merkwürdikeit bei Select max(id) from..
Vielleicht die Anzahl der Datensätze. Was für ein Typ hat das Feld?
|
Re: Merkwürdikeit bei Select max(id) from..
Das Feld ist vom Typ Bigint
Die Anzahl der Datensätze habe ich auf ca. 500.000 reduziert. Zudem habe ich ein Feld Ar2 vom Typ Integer erzeugt und mit dem Inhalt von AR gefüllt und einen Index dazu erstellt. Auch hier bleibt alles wie gehabt. Ich werde jetzt noch mal auf 250.000 Sätze reduzieren und AR enfernen. |
Re: Merkwürdikeit bei Select max(id) from..
Das beobachtete Verhalten erklärt sich wie folgt:
Firebird kennt sowohl ascending als auch descending indices. PKs werden automatisch ascending angelegt. Um die Max()-Funktion auszuführen, guckt der Optimizer nach, ob es zu dem entsprechenden Feld einen DESCENDING Index gibt. Ist ein solcher nicht vorhanden, so wird gar kein Index genutzt. Leg Dir also zusätzlich einen descending index auf das Feld, das Du mit der MAX()-Funktion bearbeiten willst und Dein Problem ist gelöst. Dies ist auch der einzige Weg, die volle Geschwindigkeit zu erhalten. Verwendet man die Variante mit dem first 1 und der descending order ohne den descending index anzulegen, so ist der db-Server immernoch gezwungen, den vollen Index zu durchlaufen. Gruß Thomas |
Re: Merkwürdikeit bei Select max(id) from..
Super!!!
Zitat:
Der Optimizer verwendet jetzt auf allen mit einem DESCENDING Index versehenen Felder auch diesen und ist entsprechend schnell. Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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