Ergebnis 1 bis 5 von 5

Thema: DELETE FROM Vater, oder DELETE FROM Sohn schneller?

  1. #1
    ApfelQ ist offline Neuer Benutzer
    Registriert seit
    25.07.2011
    Beiträge
    5

    Standard DELETE FROM Vater, oder DELETE FROM Sohn schneller?

    Hallo,

    macht es einen Unterschied, ob ich von einer "Vater-Tabelle", oder direkt in der Geerbten lösche?

    Szenario:
    Tabelle1: id (primary key), feld1, feld2, feld3
    Tabelle2: id (geerbt, primary key), feld1 (geerbt)..., feld4, feld5 INHERITS Tabelle1
    Jetzt möchte ich den Satz mit id=x löschen. Natürlich nicht nur einen, sonder ein paar 10tausend.

    Macht es einen Unterschied, ob ich
    DELETE FROM Tabelle1 WHERE id=x
    nehme, oder, wenn ich weiss, dass es in Tabelle2 steht
    DELETE FROM Tabelle2 WHERE id=x
    ?

    Gruß

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ApfelQ Beitrag anzeigen
    Hallo,

    macht es einen Unterschied, ob ich von einer "Vater-Tabelle", oder direkt in der Geerbten lösche?

    Szenario:
    Tabelle1: id (primary key), feld1, feld2, feld3
    Tabelle2: id (geerbt, primary key), feld1 (geerbt)..., feld4, feld5 INHERITS Tabelle1
    Jetzt möchte ich den Satz mit id=x löschen. Natürlich nicht nur einen, sonder ein paar 10tausend.

    Macht es einen Unterschied, ob ich
    DELETE FROM Tabelle1 WHERE id=x
    nehme, oder, wenn ich weiss, dass es in Tabelle2 steht
    DELETE FROM Tabelle2 WHERE id=x
    ?

    Gruß
    Constraint Exclusion greifen? Wie ist der Plan?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    ApfelQ ist offline Neuer Benutzer
    Registriert seit
    25.07.2011
    Beiträge
    5

    Standard

    EXPLAIN bringt für SET constraint_exclusion = off/on; genau das gleiche Ergebnis. Der DELETE direkt im "Vater" bringt mir den Vorteil, dass ich nicht erst die "Sohn" Tabelle ermitteln muss. (Im Echtfall gibt es mehr als eine .) Die (Sohn-)Tabelle, in der die zu löschende Zeile steht könnte ich zwar ermitteln, aber wenn der Geschwindigkeitsvorteil nicht enorm ist spare ich mir den Aufwand.

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ApfelQ Beitrag anzeigen
    EXPLAIN bringt für SET constraint_exclusion = off/on; genau das gleiche Ergebnis. Der DELETE direkt im "Vater" bringt mir den Vorteil, dass ich nicht erst die "Sohn" Tabelle ermitteln muss. (Im Echtfall gibt es mehr als eine .) Die (Sohn-)Tabelle, in der die zu löschende Zeile steht könnte ich zwar ermitteln, aber wenn der Geschwindigkeitsvorteil nicht enorm ist spare ich mir den Aufwand.
    Also, die Pläne sollten schon unterschiedlich sein:

    Code:
    test=*# \d+ master
                    Table "public.master"
     Column |  Type   | Modifiers | Storage | Description 
    --------+---------+-----------+---------+-------------
     i      | integer |           | plain   |             
    Child tables: s1,                                     
                  s2,                                     
                  s3                                      
    Has OIDs: no                                          
    
    test=*# \d s1;
          Table "public.s1"
     Column |  Type   | Modifiers 
    --------+---------+-----------
     i      | integer |           
    Check constraints:            
        "s1_i_check" CHECK (i >= 1 AND i <= 10)
    Inherits: master                           
    
    test=*# \d s2;
          Table "public.s2"
     Column |  Type   | Modifiers
    --------+---------+-----------
     i      | integer |
    Check constraints:
        "s2_i_check" CHECK (i >= 11 AND i <= 20)
    Inherits: master
    
    test=*# \d s3;
          Table "public.s3"
     Column |  Type   | Modifiers
    --------+---------+-----------
     i      | integer |
    Check constraints:
        "s3_i_check" CHECK (i >= 21 AND i <= 30)
    Inherits: master
    
    test=*# explain delete from master where i = 13;
                               QUERY PLAN
    -----------------------------------------------------------------
     Delete on master  (cost=0.00..40.00 rows=13 width=6)
       ->  Seq Scan on master  (cost=0.00..0.00 rows=1 width=6)
             Filter: (i = 13)
       ->  Seq Scan on s2 master  (cost=0.00..40.00 rows=12 width=6)
             Filter: (i = 13)
    (5 rows)
    
    Time: 0,492 ms
    test=*# explain delete from s2 where i = 13;
                            QUERY PLAN
    ----------------------------------------------------------
     Delete on s2  (cost=0.00..40.00 rows=12 width=6)
       ->  Seq Scan on s2  (cost=0.00..40.00 rows=12 width=6)
             Filter: (i = 13)
    (3 rows)
    
    Time: 0,335 ms
    test=*#
    Aber die Ermittlung der passenden Sohn-Tabelle sollte im Vergleich zur Gesamtarbeit verschwindend gering sein. Nach dem, was man so üblicherweise in Mailinglisten etc. sieht und hört, gilt das durchaus auch für eine 3-stellige Anzahl von Kindtabellen, mit mehr wird es dann u.U. anders. Vermutlich wäre dies dann ein Fall für ads.

    Beim Einfügen von Daten könnte es aber durchaus sinnvoll sein, es gleich in die 'richtige' zu schieben und nicht erst TRIGGER zu durchlaufen.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    ApfelQ ist offline Neuer Benutzer
    Registriert seit
    25.07.2011
    Beiträge
    5

    Standard

    Vielen Dank!

Ähnliche Themen

  1. Delete
    Von Hansat im Forum SQL
    Antworten: 7
    Letzter Beitrag: 19.12.2010, 18:38
  2. Fehlermeldung bei DELETE FROM...
    Von anna_sql im Forum Trigger und Funktionen
    Antworten: 9
    Letzter Beitrag: 22.07.2010, 20:33
  3. Delete cascade?
    Von ratio im Forum Allgemeines
    Antworten: 5
    Letzter Beitrag: 01.07.2010, 12:59
  4. DELETE mit Unterabfrage
    Von Sharky im Forum SQL
    Antworten: 3
    Letzter Beitrag: 28.12.2009, 10:20
  5. DELETE kontrollieren
    Von inoup im Forum Trigger und Funktionen
    Antworten: 3
    Letzter Beitrag: 14.02.2006, 22:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum