Delphi-PRAXiS
Seite 1 von 3  1 23      

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

ChrisE 9. Aug 2011 12:47

Datenbank: Firebird • Version: 2.5. • Zugriff über: IBDAC

Performancefrage
 
Hallo,

ich habe eine Tabelle Messungen in der sind verschiedene Informationen zu Messungen abgelegt :-) Unter anderem auch der Startzeitpunkt als TIMESTAMP. Wenn ich jetzt die jüngste Messung haben möchte würde ich folgenden Select machen:
Code:
SELECT bla, blub, tralla FROM Messungen WHERE Startzeit = (select MAX(Startzeit) from Messungen);
Über den PrimeryKey ID: Integer kann ich nicht gehen, da die Messungen nicht zwingend chronologisch in der Datenbank abgelegt werden.

So, jetzt meine Fragen:
  • Gibt es eine Performantere Lösung (nur Select anpassen) für die Problemstellung?
  • Wenn man einen Index auf die Startzeit legen würde, würde es die Abfragegeschwindigkeit verbessern? (wobei ich nochmal klären sollte, ob es mehrere Messungen geben kann, die den selben Zeitpunkt haben. Aber das gilt für die gesammte Fragestellung ;-) )
  • Ändert es etwas an der Performance wenn man es in eine SP packt, oder ist die SELECT-Anweisung dafür zu simpel/klein?

Danke, Chris

P.S.: Gibt es eigentlich keine SQL-Tags?

mkinzler 9. Aug 2011 13:01

AW: Performancefrage
 
SQL-Code:
SELECT bla, blub, tralla FROM Messungen WHERE Startzeit = ( select first 1 startzeit from Messungen order by startzeit desc);
Hierfür am Besten noche einen Index auf der Spalte Startzeit

BTW. SQL-Formatierung geht als Erweiterung des CODE-Tags (=SQL)

WladiD 9. Aug 2011 13:02

AW: Performancefrage
 
Hi Chris,

Sub-Selects sind IMHO nicht so performant wie andere Lösungen. Man sollte möglichst auf die verzichten. Deine Abfrage würde ich wie folgt umschreiben:

Code:
SELECT FIRST 1 bla, blub, tralla FROM Messungen ORDER BY Startzeit DESC
Ohne einen Index muss sowohl für "MAX(Startzeit)" als auch für "ORDER BY Startzeit DESC" die gesamte Tabelle gescannt werden. Die DB kann da keine Optimierungen vornehmen.

Dieser Fall schreit förmlich nach einem Index...kommt natürlich auf die Größe der Tabelle an.

tsteinmaurer 9. Aug 2011 13:16

AW: Performancefrage
 
Dabei ist es wichtig, dass ein absteigender Index angelegt wird. :-D

ChrisE 9. Aug 2011 13:19

AW: Performancefrage
 
Zitat:

Zitat von mkinzler (Beitrag 1115765)
BTW. SQL-Formatierung geht als Erweiterung des CODE-Tags (=SQL)

THX :thumb:
Zitat:

Zitat von WladiD (Beitrag 1115766)
Dieser Fall schreit förmlich nach einem Index...kommt natürlich auf die Größe der Tabelle an.

Zitat:

Zitat von tsteinmaurer (Beitrag 1115774)
Dabei ist es wichtig, dass ein absteigender Index angelegt wird. :-D

Das heißt, dass wenn ich die älteste Messung und die neueste möchte brauche ich zwei Indizes?

Gruß, Chris

tsteinmaurer 9. Aug 2011 13:25

AW: Performancefrage
 
Richtig.

MIN => aufsteigender (ASC) Index
MAX => absteigender (DESC) Index

Thomas

ChrisE 9. Aug 2011 13:43

AW: Performancefrage
 
Danke Euch allen :-)

Ich werde also zwei Indizes anlegen und die Variante
SQL-Code:
SELECT FIRST 1 bla, blub, tralla FROM Messungen ORDER BY Startzeit DESC
bzw
SQL-Code:
...ASC
verwenden.

Bleibt nur noch die Frage ob man noch noch schneller bekommt mit einer SP?

Gruß, Chris

WladiD 9. Aug 2011 13:57

AW: Performancefrage
 
Zitat:

Zitat von ChrisE (Beitrag 1115786)
Bleibt nur noch die Frage ob man noch noch schneller bekommt mit einer SP?

Das wird sicherlich um einige Tausend CPU-Takte schneller, da das Parsen der Query entfällt. Aber den Performancegewinn wirst du nicht messen können :wink:

Fazit: Das lohnt sich nicht.

ChrisE 9. Aug 2011 14:04

AW: Performancefrage
 
Zitat:

Zitat von WladiD (Beitrag 1115789)
Fazit: Das lohnt sich nicht.

Danke :thumb:

Gruß, Chris

FredlFesl 9. Aug 2011 18:09

AW: Performancefrage
 
Zitat:

Zitat von tsteinmaurer (Beitrag 1115782)
Richtig.

MIN => aufsteigender (ASC) Index
MAX => absteigender (DESC) Index

Thomas

Echt? Ich muss doch beim Index für MIN bzw. MAX nur den ersten oder letzten Eintrag nehmen. Beide sind gleich schnell zu erhalten... I


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 Uhr.
Seite 1 von 3  1 23      

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