performance problem
Schneider
- datenbank
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.
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
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.
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
du scheinst nicht oder zumindest schlecht lesen zu können....
Hi,
du scheinst nicht oder zumindest schlecht lesen zu können....
In wie fern?
MfG ChrisB
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.
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...
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
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
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
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.