Ankündigung

Einklappen
Keine Ankündigung bisher.

Löschen von Datensätzen wenn 1:n tabelle weniger als x Datensätze enthält

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Löschen von Datensätzen wenn 1:n tabelle weniger als x Datensätze enthält

    Wann mir einer eventuell helfen?

    DELETE FROM daten WHERE id IN (SELECT daten_id FROM daten_infos GROUP BY daten_id having COUNT(daten_id) < 2);


    Bei etwas 15.000.000 daten ist das grad etwas unperformant.

    Hätte da einer eine andere Idee? Um das zu beschleunigen?

    Grüß

    Dave
    .::Wenn das Rauskommt, wo ich überall reinkomme, komme ich da Rein, wo ich so schnell nicht mehr Rauskomme::.
    .:ie drei natürlichen Feinde des WebWorkers: Frischluft, Sonnenschein und das unerträgliche Gebrüll der Vögel.::

  • #2
    Generell ein JOIN, aber nicht jedes Subselect lässt sich in einen JOIN übertragen.
    Lass es laufen, du brauchst es doch eh nur einmal, denn gelöschter wird`s nicht

    Kommentar


    • #3
      Zitat von Dave Waterstone Beitrag anzeigen
      Wann mir einer eventuell helfen?

      DELETE FROM daten WHERE id IN (SELECT daten_id FROM daten_infos GROUP BY daten_id having COUNT(daten_id) < 2);


      Bei etwas 15.000.000 daten ist das grad etwas unperformant.

      Hätte da einer eine andere Idee? Um das zu beschleunigen?

      Grüß

      Dave
      Dazu müßte man mehr wissen:
      • welche DB, Version
      • Aufbau der Tabellen
      • Indexe
      • Verteilung der Daten
      • Explain analyse


      Vermutlich ist das aber eh eine einmalige Aktion, oder?
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Ohne spezifischere Infos: Du könntest damit
        Zitat von Dave Waterstone Beitrag anzeigen
        SELECT daten_id FROM daten_infos GROUP BY daten_id having COUNT(daten_id) < 2);
        eine separate Tabelle anlegen und an der Stelle einsetzen. Meinetwegen noch indizieren.
        Nach dem Löschen auch die Tabelle wieder löschen.

        Kommentar


        • #5
          Für mysql könnte das hier funktionieren:
          Code:
           DELETE daten
             FROM daten d
             JOIN (SELECT daten_id
                     FROM daten_infos
                    GROUP BY daten_id
                   having COUNT(daten_id) < 2) di
               on d.id = di.daten_id
          Und außerdem:
          - Löschen ist nicht performant, die Strukturen bzw. Einstellschrauben sind idR nicht darauf ausgelegt.
          - Wenn bekannt ist, wieviel dabei gelöscht wird, es gibt sicher einen Punkt, wo es schneller ist, die übrigen Datensätze neu zu schreiben (das wird mindestens bei 7,5 Mio sein, aber wahrscheinlich viel eher)
          - Je nach Mengenverhältnissen kann auch der vorherige Join von Daten und Infos erheblich beschleunigen, wenn nämlich nur ein geringer Teil der beiden Tabellen eine Schnittmenge über die ID hat.

          Zuletzt:
          Warum entfernst Du in der 1:N Relation den Master von vorhandenen Child Datensätzen?

          Mögliche Antwort: Weil die Child Datensätze über Cascade Constraints automatisch mit rausfliegen.
          > Dann bekommst Du vielleicht noch andere Probleme,,, aber das ist dann schon sehr weit im Glaskugelbereich.

          Kommentar


          • #6
            .Programmiere es aus, ohne GROUP BY. Join ist in diesem Falle für die Optimierungsroutinen jedes DB-Systems ungeeignet.

            ... objDbh = new Dbh()...
            $this->openDbh();

            $SqlQuery_1 = "SELECT daten_id FROM daten_infos
            WHERE daten_id < 2";
            $SqlResult_1 = $this->execQuery($SqlQr, __FUNCTION__); - wie auch immer

            while ($obj1= $SqlResult_1->fetch_object() )
            $SqlQuery_2 = "SELECT daten WHERE $obj1->id = daten_id";
            $SqlResult_2 = $this->execQuery($SqlQr, __FUNCTION__); - wie auch immer
            $obj2= $SqlResult_2->fetch_object(); ) {
            if (id = $obj2->id )....delete und so weiter{ }
            )else {SCHROTT IN DER DB}

            Kommentar


            • #7
              Zitat von ladmotl Beitrag anzeigen
              .Programmiere es aus, ohne GROUP BY. Join ist in diesem Falle für die Optimierungsroutinen jedes DB-Systems ungeeignet.
              *facepalm*
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar

              Lädt...
              X