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 2 von 5     12 34     Letzte »    
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 16:01
Zitat von hoika:
zur Not ne SP erzeugen.
Heiko
So würde ich es auch machen.

Man kann es auch mal so probieren:

SQL-Code:
select p.id
  , (select tb.auftragid from terminal_buchungen tb
     where tb.personalid = p.id and
           tb.buchung = (select max(tbs.buchung) from terminal_buchungen tbs where tbs.personal_id = p.id)
     ) as auftragid
  from personal p
Ungetestet natürlich...
Das Feld Buchung muss dann natürlich eindeutig sein, sonst: multiple rows in singleton select...

[EDIT]für das max muss auch das Feld buchung einen desc Index haben[/EDIT]

Frank
Frank Reim
  Mit Zitat antworten Zitat
hoika

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

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 16:11
Hallo,

versuche das mal

SQL-Code:
select p1.id, TB1.auftragsid
from personal p1
join TERMINAL_BUCHUNGEN TB1 on TB1.pid=p1.id
where
tb1.buchung in
  (select max(tb2.buchung) from TERMINAL_BUCHUNGEN
   where (tb2.pid=p1.id) and (tb2.auftragsis=tb1.auftragsid));
Ansonsten solltest du mal das SQL-Script der Tabellen
+ ein paar Daten liefern.
Habe keine Lust, das selber zu tippern.


Heiko
Heiko
  Mit Zitat antworten Zitat
Gruber_Hans_12345

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

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 18:03
also das
SQL-Code:
select p.id
  , (select tb.auftragid from terminal_buchungen tb
     where tb.personalid = p.id and
           tb.buchung = (select max(tbs.buchung) from terminal_buchungen tbs where tbs.personalid = p.id)
     ) as auftragid
  from personal p
verwendet
Code:
PLAN (TBS ORDER TERMINAL_BUCHUNGEN_BUCHUNG INDEX (TB_PERSONALID))
PLAN (TB INDEX (TB_BUCHUNG))
PLAN (P NATURAL)
also verwendet alle Indexe, braucht aber nun fast 9 sekunden


dieses Command
SQL-Code:
select p1.id, TB1.auftragid
from personal p1
join TERMINAL_BUCHUNGEN TB1 on TB1.personalid=p1.id
where
tb1.buchung in
  (select max(tb2.buchung) from TERMINAL_BUCHUNGEN tb2
   where (tb2.personalid=p1.id) and (tb2.auftragid=tb1.auftragid));
verwendet PLAN
Code:
PLAN (TB2 ORDER TERMINAL_BUCHUNGEN_BUCHUNG INDEX (TB_PERSONALID, TB_AUFTRAGID))
PLAN JOIN (P1 NATURAL, TB1 INDEX (TB_PERSONALID))
braucht aber fast 14 Minuten ...



ich habe mal folgendes probiert

SQL-Code:
set term #;

execute block
returns (ID INTEGER, MBID INTEGER)
as
declare variable ID1 INTEGER;
begin
  for execute statement
    'select ID FROM PERSONALinto ID1
  DO begin
    ID = ID1;
    MBID = null;
    execute statement 'SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = ' || ID || ' ORDER BY TB.BUCHUNG DESCINTO MBID;
    suspend;
  end
end

#
set term ;#
das braucht "nur" mehr 1.5 sekunden, also immer noch nicht wirklich schnell.

Code:
select count(*) from personal -> 268
select count(*) from Terminal_Buchungen -> 321937
Kann es sein, das es nicht mehr schneller geht diese Abfrage?
Gruss Hans

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

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

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 18:06
Habe mal folgendes probiert :

SQL-Code:
set term #;

execute block
as
declare variable ID1 INTEGER;
declare I int = 0;
begin
  while (i < 100) do
  begin
    execute statement 'SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = 9 ORDER BY TB.BUCHUNG DESCINTO ID1;
    i = i + 1;
  end
end

#
set term ;#
wobei ich beim PErsonalID un auf verscheiden filtere ...
Code:
PersonalID=9 -> 2.4 Sekunden (SELECT count(*) FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = 9 -> 3 Einträge)
PersonalID=2 -> 20 ms (SELECT count(*) FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = 2 -> 400 Einträge)
PersonalID=20 -> 20 ms (SELECT count(*) FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = 20 -> 6000 Einträge)
PersonalID=60 -> 2.4 Sekunden (SELECT count(*) FROM TERMINAL_BUCHUNGEN TB WHERE TB.PERSONALID = 60 -> 4 Einträge)
Wie hängt das da zusammen?, je wenige einträge ein personal hat, desto länger dauert die abfrage?!?!?!?!?!

Ich verstehe das absolut nicht mehr
Gruss Hans

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

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#15

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 18:32
Versuchs mal so:
SQL-Code:
select distinct personal.id as personalid, max(terminal_buchungen.auftragid) as auftragid
from terminal_buchungen inner join personal on personal.id = terminal_buchungen.personalid
group by personalid
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Gruber_Hans_12345

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

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 18:33
Zitat von webcss:
Versuchs mal so:
SQL-Code:
select distinct personal.id as personalid, max(terminal_buchungen.auftragid) as auftragid
from terminal_buchungen inner join personal on personal.id = terminal_buchungen.personalid
group by personalid
Das Problem ist, dieses SQL liefert falsche Daten, bzw andere Daten,

Ich brauche nicht den größten AuftragID wert sondern den AuftragID Wert von dem datensatz, wo Buchugn am größten ist ...
Gruss Hans

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

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#17

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 18:39
Zitat von Gruber_Hans_12345:
Zitat von webcss:
Versuchs mal so:
SQL-Code:
select distinct personal.id as personalid, max(terminal_buchungen.auftragid) as auftragid
from terminal_buchungen inner join personal on personal.id = terminal_buchungen.personalid
group by personalid
Das Problem ist, dieses SQL liefert falsche Daten, bzw andere Daten,

Ich brauche nicht den größten AuftragID wert sondern den AuftragID Wert von dem datensatz, wo Buchugn am größten ist ...
dann so:
SQL-Code:
select distinct personal.id as personalid, terminal_buchungen.auftragid as auftragid, max(terminal_buchungen.buchung) as letzte_buchung
from terminal_buchungen inner join personal on personal.id = terminal_buchungen.personalid
group by personalid, auftragid
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: ORDER in Unterselect sehr langsam

  Alt 13. Okt 2009, 20:51
Leider ist deine Frage nicht ganz präzise formuliert...

Was ist wenn einer Person noch gar kein Auftrag zugewiesen wurde, soll diese dann trotzdem erscheinen mit einem NULL Wert oder nicht?

Falls ja, versuch es so...
SQL-Code:
SELECT p.id, tb.auftragid
FROM personal p
LEFT JOIN (SELECT personalid, auftragid
           FROM terminal_buchungen tb
           WHERE buchung = (SELECT MAX(buchung)
                            FROM terminal_buchungen
                            WHERE auftragid = tb.auftragid)) tb
  ON p.id = tb.personalid
Eventuell auch etwas kompackter...
SQL-Code:
SELECT p.id, tb.auftragid
FROM personal p
LEFT JOIN terminal_buchungen tb
  ON p.id = tb.personalid
     AND (SELECT MAX(buchung)
          FROM terminal_buchungen
          WHERE auftragid = tb.auftragid) = tb.buchung
Falls nein, versuch es so...
SQL-Code:
SELECT p.id, tb.auftragid
FROM personal p
INNER JOIN terminal_buchungen tb
  ON p.id = tb.personalid
WHERE buchung = (SELECT MAX(buchung)
                 FROM terminal_buchungen
                 WHERE auftragid = tb.auftragid)
  Mit Zitat antworten Zitat
hoika

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

Re: ORDER in Unterselect sehr langsam

  Alt 14. Okt 2009, 08:14
Hallo,

warum verwendest du in der SP überhaupt eine Execute Statement ???

SQL-Code:
for select personal.id into :PId do
begin
  select xxx into :AuftragsId
end;

Wo wir beim Plan sind.
Was kommt als Plan bei,
oder anders gefragt: Hat TB.BUCHUNG wirklich einen Desc Index ?

SQL-Code:
SELECT FIRST 1 TB.AUFTRAGID FROM TERMINAL_BUCHUNGEN TB
WHERE TB.PERSONALID = 1 ORDER BY TB.BUCHUNG DESC

Heiko

[edit=mkinzler]SQL-Tags eingefügt Mfg, mkinzler[/edit]
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: ORDER in Unterselect sehr langsam

  Alt 14. Okt 2009, 08:19
Man sollte dann aber ein suspend einfügen
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     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 09:11 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