Schneider: performance problem

Guten Tag,
ich habe eine Frage bezüglich Performance einer Mysql-Datenbank-Abfrage.

folgende Datenbankstruktur/inhalt ist gegeben:

id|feldx|feldy
1|irgendwas|irgendwas
2|irgendwas|irgendwas
3|irgendwas|irgendwas
3|irgendwas|irgendwas
4|irgendwas|irgendwas
5|irgendwas|irgendwas
6|irgendwas|irgendwas
6|irgendwas|irgendwas

Nun möchte ich alle Datensätze herausfiltern, die eine doppelte ID (id) haben. Folgendes SQL-Statement benutze ich dazu:

SELECT *
FROM test
WHERE id
IN (

SELECT id
FROM test
GROUP BY id
HAVING count( id ) >1
)

Leider dauert diese Abfrage sehr lange ( > 30 sec, es handelt sich nur um ca. 1000 Datensätze). Woran kann das liegen? Fernziel soll das Löschen dieser doppelten Datensätze sein.

  1. Hi,

    Nun möchte ich alle Datensätze herausfiltern, die eine doppelte ID (id) haben.

    Ein Feld id zu benennen, dass nicht in der Lage ist, Datensätze eindeutig zu identifizieren, ist ziemlich "pervers".

    SELECT *
    FROM test
    WHERE id
    IN (

    SELECT id
    FROM test
    GROUP BY id
    HAVING count( id ) >1
    )

    Leider dauert diese Abfrage sehr lange ( > 30 sec, es handelt sich nur um ca. 1000 Datensätze). Woran kann das liegen?

    Was sagt EXPLAIN zum Statement?

    Und wieso führst du hier überhaupt eine Subquery aus?
    Du "musst" wohl, weil du keine vernünftige Möglichkeit (vorgesehen) hast, Datensätze zu identifizieren - so dass dir nur bleibt, aussen herum den kompletten Datensatzinhalt zu ermitteln, um diesen beim Löschen zur Selektion verwenden zu können?

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo,

      Ein Feld id zu benennen, dass nicht in der Lage ist, Datensätze eindeutig zu identifizieren, ist ziemlich "pervers".

      Vorgabe, kann man nichts machen. Und in der Welt, in der es existiert, äußerst sinnvoll.

      Und wieso führst du hier überhaupt eine Subquery aus?

      Um ein späteres Löschen derselbigen zu ermöglichen.

      1. Hi,

        Ein Feld id zu benennen, dass nicht in der Lage ist, Datensätze eindeutig zu identifizieren, ist ziemlich "pervers".

        Vorgabe, kann man nichts machen. Und in der Welt, in der es existiert, äußerst sinnvoll.

        Gut, wenn in dieser Welt kein Problem existiert, ist ja alles in Butter.

        Ich dachte, du hättest ein Problem mit dem Ganzen.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. du scheinst nicht oder zumindest schlecht lesen zu können....

          1. Hi,

            du scheinst nicht oder zumindest schlecht lesen zu können....

            In wie fern?

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
        2. Aussage:
          Vorgabe, kann man nichts machen. Und in der Welt, in der es* existiert, äußerst sinnvoll.

          *Bereitstellung von ids mit _nicht_ eindeutigen Werten zur Berechnung bestimmter unwichtiger Dinge

          Antwort:
          Gut, wenn in dieser Welt kein Problem existiert, ist ja alles in Butter.
          Ich dachte, du hättest ein Problem mit dem Ganzen.

          1. SELECT * FROM test WHERE id IN (
              SELECT MAX(id)
              FROM test
              GROUP BY id
              HAVING COUNT(*) > 1
            )

            Dieser Code, gefunden hier:
            http://forum.de.selfhtml.org/archiv/2005/5/t107296/

            weisst ebenfalls dieses Problem auf...

          2. Hi,

            Vorgabe, kann man nichts machen. Und in der Welt, in der es* existiert, äußerst sinnvoll.

            Also sollen in dieser Welt keine Duplikate gelöscht werden.

            *Bereitstellung von ids mit _nicht_ eindeutigen Werten zur Berechnung bestimmter unwichtiger Dinge

            Wenn diese ID sich auf irgendwelche externen Daten bezieht, dann kann sie gerne in einer zusätzlichen Spalte als Fremdschlüssel stehen.
            Trotzdem sollte jeder Datensatz eine eigene, "richtige" ID bekommen.

            Gut, wenn in dieser Welt kein Problem existiert, ist ja alles in Butter.
            Ich dachte, du hättest ein Problem mit dem Ganzen.

            Und ich dachte, *du* hättest eins mit dem "Ganzen" - nämlich was die Performance beim für's Löschen von Duplikaten nötigen Auffinden und Identifizieren dieser angeht ...

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Lieber ChrisB,

              "Wenn diese ID sich auf irgendwelche externen Daten bezieht, dann kann sie gerne in einer zusätzlichen Spalte als Fremdschlüssel stehen.
              Trotzdem sollte jeder Datensatz eine eigene, "richtige" ID bekommen."

              das ist ja alles richtig was du sagst. Aber es handelt sich hier um eine Vorgabe, welchen Teil von Vorgabe hast du nicht verstanden? Ich kann in die Struktur nicht eingreifen, nichts ändern, noch etwas vorschlagen, was man ändern könnte. (Und glaube mir, es IST sinnvoll, aber das nur am Rande.)

              Der Rest deiner Postings ist Wortklauberei, dazu fehlt mir leider die Zeit. Habe das Problem jetzt anders gelöst.

              Schönes Wochenende
              Schneider

      2. ach so, das sagt EXPLAIN:

        1   PRIMARY   test
           ALL   NULL   NULL   NULL   NULL   1000   Using where

        2 DEPENDENT SUBQUERY test
          index NULL id 20 NULL 1000 Using index

  2. SELECT *
    FROM test
    WHERE id
    IN (

    SELECT id
    FROM test
    GROUP BY id
    HAVING count( id ) >1
    )

    SELECT ID, COUNT(*) AS zaehler
    FROM table
    GROUP BY ID
    HAVING zaehler > 1

    Grüße, Franz Z.