AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

delete mit join

Ein Thema von hoika · begonnen am 10. Mai 2007 · letzter Beitrag vom 11. Mai 2007
Antwort Antwort
hoika

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

delete mit join

  Alt 10. Mai 2007, 14:29
Datenbank: FB • Version: 1.5 • Zugriff über: egal
Hallo #,

folgender Code erzeugt einen Fehler (join wird angemeckert)
SQL-Code:
Delete From DataFoxInput_Details1
Join DataFoxInput on DataFoxInput.Id=DataFoxInput_Details1.DataFoxInputId
Where
  (DataFoxInput.TheDate=:CheckDate) And
  (DataFoxInput_Details1.Flag Is Null) And
  (DataFoxInput_Details1.CardNo Is Null)
Ich versuche einen Detail-Eintrag (Tabelle: DataFoxInput_Details1) eines bestimmten Tages
zu löschen, der Tag steht aber nur in der Mastertabelle (DataFoxInput.TheDate).
Bekomme ich das ohne "where in " hin ?


Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: delete mit join

  Alt 10. Mai 2007, 15:02
Nimm einen Subselect
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

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

Re: delete mit join

  Alt 10. Mai 2007, 15:19
Hallo,

etwa so ?
ist die 2. Detail-Tabelle, aber ähnlich aufgebaut.


Delphi-Quellcode:
SQL.Add('Delete From DataFoxInput_Details2');
SQL.Add('Where');
SQL.Add(' (DataFoxInput_Details2.DataFoxInputId');
SQL.Add(' In (Select DataFoxInput.Id From DataFoxInput');
SQL.Add(' Where DataFoxInput.TheDate=:CheckDate)');
SQL.Add(' )');
Das geht FB sowas von in die Knie.

Ein
select * from DataFoxInput_Details2
Where
(DataFoxInput_Details2.DataFoxInputId
In (Select DataFoxInput.Id From DataFoxInput
Where DataFoxInput.TheDate='8.12.2007'))

braucht 50 Sekunden (lokaler SQL-Server)

Plan:
PLAN (DATAFOXINPUT INDEX (RDB$PRIMARY153))
PLAN (DATAFOXINPUT_DETAILS2 NATURAL)


Das hier im Select natürlich ein Join besser wäre,
ist klar, es geht aber ja am das delete.

Was is nu kaputt ?
Indizes sind natürlich deauf.
die Details2 Tabelle hat etwa 2.7 Mio Einträge,
davon ~ 30000 vom 8.12.


Heiko
Heiko
  Mit Zitat antworten Zitat
hoika

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

Re: delete mit join

  Alt 10. Mai 2007, 15:27
erledigt:
die folgenden SP braucht 3 Sekunden,
das reicht.


Heiko
SQL-Code:

CREATE PROCEDURE SP_DATAFOX_DELETEDETAILS2 (
    THEDATE DATE)
AS
DECLARE VARIABLE iCurId Integer;
begin
  for select det2.id from DataFoxInput_Details2 det2
  join
    DataFoxInput on DataFoxInput.Id = det2.DataFoxInputId
  where
    DataFoxInput.theDate = :TheDate
  into :iCurId do
  begin
    Delete From DataFoxInput_Details2 Where Id=:iCurId ;
  end

  Suspend;
end


nächster Test

SQL-Code:
select count(*) from DataFoxInput_Details2 det2_1
Where
  det2_1.id in
  
  (
    select
      det2_2.id from DataFoxInput_Details2 det2_2
    join
      DataFoxInput on DataFoxInput.Id = det2_2.DataFoxInputId
    where
      DataFoxInput.theDate = '8.12.2007'
  )
ergibt 30 Sekunden.

Ich werde jetzt mal ne SP schreiben.


Heiko
Heiko
  Mit Zitat antworten Zitat
omata

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

Re: delete mit join

  Alt 10. Mai 2007, 20:20
Hallo hoika,

was spricht gegen folgende Variante...
SQL-Code:
DELETE FROM DataFoxInput_Details1
WHERE DataFoxInputId IN (SELECT id
                         FROM DataFoxInputId
                         WHERE TheDate = :CheckDate)
  AND Flag IS NULL
  AND CardNo IS NULL
oder auch...
SQL-Code:
DELETE FROM DataFoxInput_Details1
WHERE EXISTS (SELECT *
              FROM DataFoxInputId
              WHERE TheDate = :CheckDate
                AND id = DataFoxInputId)
  AND Flag IS NULL
  AND CardNo IS NULL
Gruss
Thorsten
  Mit Zitat antworten Zitat
hoika

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

Re: delete mit join

  Alt 10. Mai 2007, 20:53
Hallo,

Laufzeit > 1 min pro Query spricht dagegen.
Das gleiche in einer SP -> 2 sec.


Heiko
Heiko
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#7

Re: delete mit join

  Alt 10. Mai 2007, 21:09
schneller gehen sollte es so:

SQL-Code:
CREATE PROCEDURE SP_DATAFOX_DELETEDETAILS2 (
    THEDATE DATE)
AS
DECLARE VARIABLE iCurId Integer;
begin
  for select id from DataFoxInput
        where theDate = :TheDate
       into :iCurId
  do
  begin
    Delete From DataFoxInput_Details2 Where DataFoxInputId = :iCurId ;
  end
end
Der Join, den Du hier drin hattest, brachte keine Vorteile, im Gegenteil, es wurden mehr Datensätze selektiert.

Hope it helps

onlinekater

[Edit] Das überflüssige SUSPEND entfernt. Das wird hier nicht gebraucht, da die Stored Procedure keine Rückgabewerte hat. Man sollte es hier nicht verwenden. [/Edit]
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
omata

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

Re: delete mit join

  Alt 10. Mai 2007, 23:11
@hoika:

Ok, wenn das so ist. Ich habe das gerade mal ausprobiert und 160000 Datensätze werden bei mir mit der EXISTS-Variante in 5 Sekunden gelöscht. Vermutlich hast du wesentlich mehr Datensätze.

Gruss
Thorsten
  Mit Zitat antworten Zitat
hoika

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

Re: delete mit join

  Alt 11. Mai 2007, 10:26
Hallo,

danke noch mal an beide,
ohne join ist es noch ein "bissel" schneller

und das mit dem Exists kannte ich so noch gar nicht *wunder*
ist in 1 sec durch ...

Soll ich die sp jetzt wegwerfen ???


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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:41 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