AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ORDER in Unterselect sehr langsam
Thema durchsuchen
Ansicht
Themen-Optionen

ORDER in Unterselect sehr langsam

Ein Thema von Gruber_Hans_12345 · begonnen am 13. Okt 2009 · letzter Beitrag vom 15. Okt 2009
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 12:45
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBConsole
Hallo, ich verwende folgendes Statemant

SQL-Code:
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
als Plan bekomme ich folgendes raus
Code:
PLAN (TB ORDER TB_BUCHUNG INDEX (TB_PERSONALID))
PLAN (P NATURAL)
würde eigetnlich gut aussehen, aber leider ist es sehr langsam (5 Sekunden)

im vergleich ohne dem ORDER
SQL-Code:
SELECT P.ID, (SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = P.ID) AS AUFTRAGID
FROM PERSONAL P
als PLAN

Code:
PLAN (TB INDEX (TB_PERSONALID))
PLAN (P NATURAL)
und benötigt ca. 100 ms

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?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 13:21
Zitat von Gruber_Hans_12345:
Code:
TB.BUCHUNG DESC
ist darauf ein Index?
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#3

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 13:28
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)
Miniaturansicht angehängter Grafiken
neu-1_977.png  
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von rweinzierl
rweinzierl

Registriert seit: 22. Mär 2005
98 Beiträge
 
#4

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 13:54
Hallo

Du kannst ja beim Select den Plan mit angeben ==> Vielleicht wirds dadurch schneller

mfg

Reinhold



-----------
Dokumentation der Arzneimittel www.ithof.de
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#5

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 14:16
Zitat von rweinzierl:
Hallo
Du kannst ja beim Select den Plan mit angeben ==> Vielleicht wirds dadurch schneller
Und was gebe ich ihm al sPLAN an, damit er schneller wird?

bzw. gibt es irgendwoi eine doku, wann FB für einen ORDER einen Index verwendet und wann nicht?!?!?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von rweinzierl
rweinzierl

Registriert seit: 22. Mär 2005
98 Beiträge
 
#6

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 14:34
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
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#7

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 14:54
Zitat von rweinzierl:
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
Also in eine Zusatztabelle möchte ich es nicht speichern, wird wieder sehr komplex, da pro aufrag mehr als eine person angemeledt sein kann, und eine person wieder auf mehreren aufträgen ....

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 ...

Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
hoika

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

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 15:03
Hallo,


Zitat:
gibt es irgendwoi eine doku, wann FB für einen ORDER einen Index verwendet und wann nicht?!?!?
Das entscheidet der Optimizer bei jeder Query separat.


SQL-Code:
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
Was willst du denn eigentlich erreichen ?

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:
Select Max(TB.BUCHUNG) AS AUFTRAGID, PersonalId
From FROM TERMINAL_BUCHUNGEN
Group By PersonalId
Grouping ist meine grosse Schwäche
Ob dann noch ein Desc Index auf TERMINAL_BUCHUNGEN.BUCHUNG notwendig ist,
musst du ausprobieren.
Auf TERMINAL_BUCHUNGEN.PERSONALID sollte aber einer draufsein.


Heiko
Heiko
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#9

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 15:34
Zitat von hoika:
Hallo,


Zitat:
gibt es irgendwoi eine doku, wann FB für einen ORDER einen Index verwendet und wann nicht?!?!?
Das entscheidet der Optimizer bei jeder Query separat.


SQL-Code:
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
Was willst du denn eigentlich erreichen ?

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:
Select Max(TB.BUCHUNG) AS AUFTRAGID, PersonalId
From FROM TERMINAL_BUCHUNGEN
Group By PersonalId
Grouping ist meine grosse Schwäche
Ob dann noch ein Desc Index auf TERMINAL_BUCHUNGEN.BUCHUNG notwendig ist,
musst du ausprobieren.
Auf TERMINAL_BUCHUNGEN.PERSONALID sollte aber einer draufsein.


Heiko

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 ...
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
hoika

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

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 15:58
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 19:36 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