Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Performancefrage (https://www.delphipraxis.net/162146-performancefrage.html)

tsteinmaurer 9. Aug 2011 18:51

AW: Performancefrage
 
Echt. :-D

Probier einfach mal aus: Erstelle dir eine Tabelle mit einem Feld und führe dann aus:

- MIN und MAX ohne Index
- MIN und MAX bei Existenz eines aufsteigenden Index
- MIN und MAX bei Existenz eines absteigenden Index
- MIN und MAX bei Existenz beider Indizes

Welche Ausführungspläne werden für die 4 Varianten gewählt?

FredlFesl 10. Aug 2011 07:52

AW: Performancefrage
 
Ach, ich sehe gerade: Firebird. Na dann is klar.

MSSQL z.B. ist das schlauer

DeddyH 10. Aug 2011 08:07

AW: Performancefrage
 
Was hat das mit schlauer zu tun? Wenn ich z.B. eine absteigend sortierte Zahlenliste habe und möchte den kleinsten Wert ermitteln, muss ich die gesamte Liste durchlaufen, da er ja logischerweise ganz am Ende steht. Brauche ich den größten Wert, bekomme ich den quasi sofort. Genauso verhält es sich natürlich äquivalent andersherum.

tsteinmaurer 10. Aug 2011 09:47

AW: Performancefrage
 
Die Sache ist die, dass Firebird keine bidirektionalen Indizes unterstützt, d.h. eine rasche Travesierung von vorne nach hinten und umgekehrt mit nur einem Index.

Neumann 10. Aug 2011 09:55

AW: Performancefrage
 
Wenn ich mir die SQL-Abfrage von ChristE ansehe, kann die eigentlich nicht funktionieren:

SELECT bla, blub, tralla FROM Messungen WHERE Startzeit = (select MAX(Startzeit) from Messungen)

MAX ist in der WHERE-Klausel nicht erlaubt.

Würde folgendes vorschlagen:

Code:
SET TERM ^ ;

CREATE OR ALTER PROCEDURE TESTP
returns (
    pdatum timestamp,
    pWert integer)
as
declare variable adatum timestamp;
begin
  /* Procedure Text */
  select max(datum) from Messungen into :adatum;
  for select datum, wert from Messungen where datum = :adatum into :pdatum ,:pwert do
  suspend;
end^

SET TERM ; ^
Das for select braucht man, da mehrere Datensätze zurückgeliefert werden könnten. Will man nur einen Datensatz, kann man z.B. noch eine Abfrage nach der max(ID) zwischenschalten und die dann in der letzten where-Klausel benutzen.

Ein Test mit IBExpert und rund 19000 Datensätzen sowie 5 Ergebniszeilen dauert weniger als eine halbe Sekunde, das Ergebnis ist praktisch sofort da.

DeddyH 10. Aug 2011 09:57

AW: Performancefrage
 
Wo steht denn MAX in der WHERE-Klausel? Das MAX gehört zum Subselect und ist dort durchaus erlaubt.

mkinzler 10. Aug 2011 10:04

AW: Performancefrage
 
Sonst müsste es in die HAVING-Klausel

tsteinmaurer 10. Aug 2011 10:07

AW: Performancefrage
 
@Ralf: MAX ist im Subselect und durchaus erlaubt. Bzgl. Performance. 19.000 Datensätze würde ich nicht für Performancemessungen hernehmen. Das sind Peanuts. Interessanter wirds im Millionenbereich.

Neumann 10. Aug 2011 10:18

AW: Performancefrage
 
Ja stimmt, hab es noch mal probiert. Beim 1. Versuch hat IBExpert das angemeckert. Scheint aber etwas langsamer zu sein als die SP, eine genaue Messung habe ich leider nicht.

Mit 850000 Datensätzen komme ich mit beiden Varianten auf rund 5 s.

tsteinmaurer 10. Aug 2011 10:19

AW: Performancefrage
 
Ich nehme mal an, ohne Indizes?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr.
Seite 2 von 3     12 3      

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