![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBConsole
ORDER in Unterselect sehr langsam
Hallo, ich verwende folgendes Statemant
SQL-Code:
als Plan bekomme ich folgendes raus
SELECT P.ID, (SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = P.ID ORDER BY TB.BUCHUNG DESC) AS AUFTRAGID
FROM PERSONAL P
Code:
würde eigetnlich gut aussehen, aber leider ist es sehr langsam (5 Sekunden)
PLAN (TB ORDER TB_BUCHUNG INDEX (TB_PERSONALID))
PLAN (P NATURAL) im vergleich ohne dem ORDER
SQL-Code:
als PLAN
SELECT P.ID, (SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = P.ID) AS AUFTRAGID
FROM PERSONAL P
Code:
und benötigt ca. 100 ms
PLAN (TB INDEX (TB_PERSONALID))
PLAN (P NATURAL) das problem ist, das ich dieses statemant sehr oft aufrufen muß, ... und dadurch macht sich diese 5 sekunden sehr bemerkbar :( weiss jemand wie ich das beschleunigen kann? |
Re: ORDER in Unterselect sehr langsam
Zitat:
|
Re: ORDER in Unterselect sehr langsam
Liste der Anhänge anzeigen (Anzahl: 1)
ja ist
habe es im ORDER auch mit TB.ID prboiert, das ist der PRIMARY KEY und auch bei dem ist es gleich langsam da bekomme ich folgenden PLAN
Code:
PLAN (TB ORDER RDB$PRIMARY87 INDEX (TB_PERSONALID))
PLAN (P NATURAL) |
Re: ORDER in Unterselect sehr langsam
Hallo
Du kannst ja beim Select den Plan mit angeben ==> Vielleicht wirds dadurch schneller mfg Reinhold ----------- Dokumentation der Arzneimittel ![]() |
Re: ORDER in Unterselect sehr langsam
Zitat:
bzw. gibt es irgendwoi eine doku, wann FB für einen ORDER einen Index verwendet und wann nicht?!?!? |
Re: ORDER in Unterselect sehr langsam
Hallo
Sorry hab deine Meldung nochmals genau gelesen. Ich dachte der Plan der 100 ms Lösung könntest du verwenden, der ist jedoch ohne Order by ... Als nächstes würde ich eine View mit eben der aktuellsten Auftragsid pro Buchung testen. ==> Wenn das auch nichts hift könnte man noch die Daten (aktuelle Auftragsid pro Buchung) in eine Hilfstabelle schreiben. Klar wiederspricht der Grundregel keine berechenbaren Daten speichern, aber schnell wird das auf alle Fälle. mfg Reinhold |
Re: ORDER in Unterselect sehr langsam
Zitat:
Ich hätte auch schon probiert die SELECT in SELECT in eine plain SELECT (also mit Joins umzubauen) aber das bringe ich auch irgendwie nicht zusammen Den soviel ich bisher merken konnte hat der Firebird noch oft probleme, so wie mit dem IN ... :( |
Re: ORDER in Unterselect sehr langsam
Hallo,
Zitat:
SQL-Code:
Was willst du denn eigentlich erreichen ?
SELECT P.ID, (SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = P.ID ORDER BY TB.BUCHUNG DESC) AS AUFTRAGID
FROM PERSONAL P Hast du auf TERMINAL_BUCHUNGEN.BUCHUNG auch einen DESC Index ? Ein normaler (ASC) reicht nicht. Ich würde das SubSelect eh weglassen. Wie du richtig festgestellt hast, at FB du schon noch Probleme. Mach es doch etwa so
SQL-Code:
Grouping ist meine grosse Schwäche ;)
Select Max(TB.BUCHUNG) AS AUFTRAGID, PersonalId
From FROM TERMINAL_BUCHUNGEN Group By PersonalId Ob dann noch ein Desc Index auf TERMINAL_BUCHUNGEN.BUCHUNG notwendig ist, musst du ausprobieren. Auf TERMINAL_BUCHUNGEN.PERSONALID sollte aber einer draufsein. Heiko |
Re: ORDER in Unterselect sehr langsam
Zitat:
Hallo also ich habe mittlerweile auf fast jedes Feld 2 Indexe einen ASC und einen DESC (zum testen) Die tabelle hat ja auch mittlerweile schon über 8 Millionen einträge ... Das Problem ist ja, eine normales Group bringt nicht die werte die ich brauche, da ich ja den Wert AUFTRAGID aus der Tabelle TERMINAL_BUCHUNGEN brauche der am aktuellesten ist (sprich TB.BUCHUNG am ältesten) (in der echt applikation sind noch ein paar WHERE dabei, aber die machen keinen Unterschied aus) wenn eis ein SELECT (TBAUFTRAGID BY MAX(TB.BUCHUNG)) oder so geben würde sprich eine Aggreagatfunktion, die mir die Spalte AuftragID zurückliefert, von der Zeile, wo MAX(TB.BUCHUNG) das wäre ideal .... sowas kann ich meines erachtens nur mit so nem (SELECT FIRST 1 ... ) erreichen, ansonsten würde ich es auch in ein GROUP umbauen ... |
Re: ORDER in Unterselect sehr langsam
Hallo,
das hatte ich BUCHUNG, AUFTRAGID in der Struktur übersehen. Naja, zur Not ne SP erzeugen. Auf jeden Fall ist die Tabelle Personal unnötig, da die PersonalId ja schon in der Tabelle TERMINAL_BUCHUNGEN steht. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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