Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sortierung mit Limit (https://www.delphipraxis.net/144159-sortierung-mit-limit.html)

fatalerror 1. Dez 2009 15:09

Datenbank: MYSQL • Version: 5 • Zugriff über: Zeos

Sortierung mit Limit
 
Ich benötige die letzten 50 Einträge aus einer Tabelle aber geordnet nach dem Datum.
DB: MySQL

Folgendes Query löst zwar meine Anforderung, ich nehme aber an, dass dies doch performanter geht

Delphi-Quellcode:
Select * from ( Select * from tablexy order by datum DESC Limit 50)test order by datum ASC
(Ja ich weiss, dass ich * nicht verwenden soll, ist hier nur zum einfacheren Verständnis aufgeführt)

mkinzler 1. Dez 2009 15:16

Re: Sortierung mit Limit
 
Versuch mal Limit -50

fatalerror 1. Dez 2009 15:21

Re: Sortierung mit Limit
 
Zitat:

Zitat von mkinzler
Versuch mal Limit -50

funktioniert leider nicht:
Delphi-Quellcode:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-50' at line 1

alzaimar 1. Dez 2009 15:47

Re: Sortierung mit Limit
 
Ein DB-Server ist gar nicht gut darin, Tabellen zu sortieren bzw. die Tabellen als (geordnete) 'Tabellen' aufzufassen. So gesehen ist schon die Bezeichnung 'Tabelle' unglücklich: Es sollte Datenmenge (Dataset) heißen, denn die Daten liegen per definitionem SQL ungeordnet in der Datenbank. Theoretisch darf sich die Reihenfolge bei einer unsortierten Datenmenge (keinerlei Index) bei jedem SELECT ändern.

Weil das so ist, hat man auch Probleme, die letzten 50 Zeilen einer "nach einem bestimmten Kriterium sortierten Datenmenge" zu bekommen. Du siest schon an der eigentlich korrekten Problemstellung, das das nicht so einfach ist.

So wie Du dir das überlegt hast, ist es schon ganz ok, bzw. würde ich das jetzt auch so machen.

Performanter wirst Du mit einem Index, wobei ich mal hoffe, das MySQL einen Index bei der Sortierung berücksichtigt. Erstelle also einen Index auf der Spalte 'Datum' und beachte dabei das RDBMS-typische Optimierungspotential (Manual lesen). Bei einigen RDBMS kann man nämlich einen Index absteigend sortiert anlegen, sodaß der dann direkt für die 'ORDER BY xxxx DESC' Klausel verwendet werden kann.

Wenn MySQL einen Query-Plan anzeigen kann, lerne, ihn zu lesen (wenn Du das nicht schon kannst). Mit reinen Zeitmessungen kommt man nämlich nicht weit, weil einige RDBMS die Abfragen cachen, sodaß der zweite (identische) Versuch einer Abfrage u.U. -wupps- sofort da ist.

Alternative als Denkanstoß, was man sonst noch machen kann (bestimmt langsamer, aber resourcenschonender):
SQL-Code:
Select * From Tabelle
 Where PrimaryKey in
   (select PrimaryKey from Tabelle order by datum desc limit 50)
order by datum

mkinzler 1. Dez 2009 15:50

Re: Sortierung mit Limit
 
Zudem ist eine DERIVED Table nicht per se inperformant

fatalerror 1. Dez 2009 15:56

Re: Sortierung mit Limit
 
@alzaimer
@mkinzler

danke für die infos.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 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