AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi aktuellsten Record (anhand Datum/Uhrzeit) ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

Ein Thema von hoika · begonnen am 28. Jan 2008 · letzter Beitrag vom 28. Jan 2008
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

  Alt 28. Jan 2008, 10:49
Datenbank: FB • Version: 1.5 • Zugriff über: egal
Hallo #,

folgendes Tabelle habe ich (Dialect 1)

Id Integer // prim key
EventDate Date
EventTime Date
EventId Integer

Ich möchte jetzt für eine bestimmte EventId den letzten Eintrag haben.
Id geht aus bestimmten Gründen nicht.

Ich muss EventDate/EventTime benutzen.
Bisher mache ich das immer so (IB6.0 geschädigt)

Select EventDate,EventTime,EventId
Order By EventDate Desc, EventTime Desc

Dann hole ich mir den ersten Eintrag und der ist ja der aktuellste

Unter FB1.5 geht auch das

Select First 1 EventDate,EventTime,EventId
Order By EventDate Desc, EventTime Desc

Jetzt die Frage.
Der Queryplan ist der gleiche, die Abfragezeit auch (ok, ok, wenige Records)
Aber: Wie genau wird das First 1 von FB optimiert?

Ist die interne Abfrage schon optimiert ?
Ist das Resultset auf dem Server schon kleiner (1 Record),
oder macht der erst beim Fetch nach dem 1. Datensatz Schluss ?


Die Release Notes sagen nicht viel darüber aus ?

Hat jemand praktische Erfahrungen ?



Danke
Heiko
Heiko
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

  Alt 28. Jan 2008, 11:34
Ohne Index auf EventDate und EventTime ist der Server zu einem Full Table Scan gezwungen.
D.H. er muss auf jeden Fall die ganze Tabelle durchrattern und sich EventDate und EventTime sortiert merken.
Erst wenn er die ganze Liste aufgebaut hat, werden die Daten ausgegeben, wobei die Ausgabe nach dem 1. Datensatz beendet ist.
Die Liste enthält dabei nicht alle Daten die ausgegeben werden sollen, sondern nur die Reihenfolge der Datensätze.
Also: ORDER BY bedeutet nicht, das die ganzen Daten sortiert im Speicher sein müssen. (Stichwort: indirektes Sortieren)

Sollte auf EventDate und EventTime ein Index liegen, kann der Server diesem Index in der richtigen Richtung folgen und ist damit bei vielen Datensätzen deutlich schneller.
Der Performancegewinn stellt sich aber erst ab einer bestimmten Datensatzanzahl (50..1000) ein.
Andreas
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

  Alt 28. Jan 2008, 15:23
Ohne Index auf EventDate und EventTime ist der Server zu einem Full Table Scan gezwungen.
D.H. er muss auf jeden Fall die ganze Tabelle durchrattern und sich EventDate und EventTime sortiert merken.
Erst wenn er die ganze Liste aufgebaut hat, werden die Daten ausgegeben, wobei die Ausgabe nach dem 1. Datensatz beendet ist.
Die Liste enthält dabei nicht alle Daten die ausgegeben werden sollen, sondern nur die Reihenfolge der Datensätze.
Also: ORDER BY bedeutet nicht, das die ganzen Daten sortiert im Speicher sein müssen. (Stichwort: indirektes Sortieren)

Sollte auf EventDate und EventTime ein Index liegen, kann der Server diesem Index in der richtigen Richtung folgen und ist damit bei vielen Datensätzen deutlich schneller.
Der Performancegewinn stellt sich aber erst ab einer bestimmten Datensatzanzahl (50..1000) ein.
Andreas
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

  Alt 28. Jan 2008, 19:25
Hallo,

die Frage war aber nicht der Index, sondern das First 1.
Wird das von FB gesondert schon beim Execute benutzt,
oder baut er das Result-Set komplett auf und gibt dann
nur das 1. Ergebnis zurück ?



Heiko
PS: Dass der Index desc sein muss, ist auch klar.
Heiko
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

  Alt 28. Jan 2008, 19:43
Zitat von hoika:
die Frage war aber nicht der Index, sondern das First 1.
Wird das von FB gesondert schon beim Execute benutzt,
oder baut er das Result-Set komplett auf und gibt dann
nur das 1. Ergebnis zurück ?
Zuerst kommt das Sortieren. Beim Indirekten Sortieren werden die eigentlichen Daten nicht im Speicher gehalten.
Es macht (im Prinzip) keinen Unterschied, ob die Tabelle 5 oder 100 Felder hat oder wieviele Felder im Resultset sein sollen.
Danach kommt die Ausgabe des Resultsets. Die SQL Engine erkennt schon nach der Ausgabe des 1. Records, dass sie fertig ist und hört auf.
=> also baut er das Result-Set nicht komplett auf

Zitat von hoika:
PS: Dass der Index desc sein muss, ist auch klar.
Wenn FB "schlau" ist und der Index aufsteigend ist, die Sortierung aber absteigend sein soll, dann wird FB
den Indexbaum einfach "rückwärts" durchlaufen.
Nur wenn EventDate aufsteigend, aber nach EventTime absteigend sortiert werden soll, aber ein gemeinsamer Index auf den Feldern liegt, kann die SQL Engine den Index nicht verwenden.
Andreas
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: aktuellsten Record (anhand Datum/Uhrzeit) ermitteln

  Alt 28. Jan 2008, 19:58
Hallo,

Nö,

da muss ich mal sagen, stimmt nicht ....

Ein Asc Index wird von FB NIE für Desc-Suche benutzt.
Rückwärts suchen kann FB nicht.
Das liegt daran, dass die Index-Daten selbst komprimiert sind,
und zwar so, dass nur die richtige Suche (asc/desc) verwendet werden kann.

Deshalb sagt man ja immer auch, für Desc Search immer einen Desc-Index anlegen.

Würde ich allerdings EventDate Asc / EventTime Desc suchen,
müsste ein zusammenhängender Index mindestens EventDate Asc haben,
ein EventDate Asc / EventTime Desc würde auch gehen
das EventDate würde per Index würde, dass EventTime "zu Fuß" gesucht.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
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