AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Performance-Prob mit Subselect
Thema durchsuchen
Ansicht
Themen-Optionen

Performance-Prob mit Subselect

Ein Thema von hoika · begonnen am 21. Jan 2008 · letzter Beitrag vom 22. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
hoika

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

Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:01
Datenbank: FB • Version: 1.5, 2.0 • Zugriff über: egal
Hallo #,

ich habe folgende Tabellen

project: project_id, projekt_state
pos: pos_id, project_id, pos_state
booking: booking_id,project_id
except_projects: except_projects:_id,project_id

in projects stehen Projekte (wer hätte das gedacht),
in pos stehen Projekt-Positionen,
in booking Projekt-Buchungen.

Ich möchte jetzt alle Buchungen der Projekte/Positionen, die nicht in
except_projects stehen

SQL-Code:
Select Booking.booking_id,Booking.project_id From Booking
Join Project On Project.project_id=Booking.project_id
Join Pos On Pos.project_id=Project.project_id
where Booking.project_id not in
(Select except_projects.project_id From except_projects)
es werden noch Stati abgefragt (project_state, pos_state)

Hm, soweit so gut,
jetzt habe ich aber ein massives Performance-Problem.

10 sec. Prepare, 10 sec. Fetch (lokal)


except_projects: 160 Einträge, aber 9 Mio. ausgelesen
project:: 195 Einträge, 80.000 mal ausgelesen
pos:: 4000 Einträge, 80.000 mal ausgelesen

Im Plan sind nur Index-Scans, kein natural.


Wie könnte ich die Abfrage ändern ?


Edit:
=====
Das ganze als SP dauert komplett nur 3 Sekunden,
also wieder SP basteln ;(



Heiko
Heiko
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:42
Ich kenn mich mit Firebird nicht besonders aus, aber bringt es vielleicht was, die Abfrage so zu gestalten?

SQL-Code:
select s.b_id, s.p_id from
  (Select Booking.booking_id as b_id,Booking.project_id as p_id From Booking
   Join Project On Project.project_id=Booking.project_id
   Join Pos On Pos.project_id=Project.project_id
  ) as s
where s.p_id not in (Select except_projects.project_id From except_projects)
Überhaupt klingt das Problem sehr merkwürdig Ist FB vielleicht so eingestellt, keine temporäre Tabellen oder ähnliches für solche Queries anzulegen?
  Mit Zitat antworten Zitat
hoika

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

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:44
Hallo,

und nun das ganz gemeine,
die Query ist nur unter FB2 (die aktuellste) so extrem langsam,
unter FB1.5 hat die

FB1.5
SP: 8 ms execute, 3000 ms fetch
Query: 800 ms execute, 3000 ms fetch

FB2.0
SP: etwa wie FB1.5
Query: 8000 ms execute, 10000 ms fetch


Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:45
Und wenn du die 4 tabelle auch dazujoinst?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:45
Du kannst ja auch mal hier nachlesen: http://www.sql-tips.de/index.php/INN...von_Subselects

Hth
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

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

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:48
Hallo mkinzler,

welche 4. Tabelle ?
Das ist ja ein Subselect mit NOT IN.

OK, man könnte ein outer join mit "IS NULL" machen.

wie DeddyH aus genau hingelinkt hat ...
mal sehen


Heiko
Heiko
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 16:59
SQL-Code:
Select Booking.booking_id,
       Booking.project_id
  From (
       Booking
       Join Project On Project.project_id=Booking.project_id
       Join Pos On Pos.project_id=Project.project_id
       )
       Left join except_projects on except_projects.project_id = Booking.projectID
where except_projects.project_id is null
So gehts ohne subselect, vielleicht ist es schneller. Eigentlich sollte das ja in Nullkommanix gehen....

Ach ja: Ich weiss, das Du was gegen Left Joins hast, aber man weiss nie, was ein Optimizer draus macht.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
hoika

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

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 17:47
Hallo,

die Query von alzaimar bringt es fast.

SQL-Code:
Select Booking.booking_id,
       Booking.project_id
  From (
       Booking
       Join Project On Project.project_id=Booking.project_id
       Join Pos On Pos.position_id=Booking.position_id
       )
       Left join except_projects on except_projects.project_id = Booking.projectID
where except_projects.project_id is null
OK das Booking.position_id hatte ich unterschlagen.

Ausführungszeit unter FB1.5 und FB2.0 ist OK,

1600 ms execution, 3000 ms fetch


Tja, mit einer SP bin ich bei 9 ms execution.

Soll ich nu ne SP nehmen oder besser das "Standard"-SQL lassen.


Was meint ihr ?


Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 17:48
Wenn die SP schon existiert, warum nicht nehmen?
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

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

Re: Performance-Prob mit Subselect

  Alt 21. Jan 2008, 18:23
Hallo,

die habe ja nur mal so schnell "getippert".
Das Problem ist, wenn ich mal ne andere DB unterstützen will,
muss ich wieder eine SP anpassen.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:01 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