PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Suchen Sie in einer großen Tabelle nach vollständigen doppelten Zeilen

Um herauszufinden, ob irgendwelche vollständiges Duplikat existiert (identisch auf allen Spalten), das ist wahrscheinlich der schnellste Weg:

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid <> t1.ctid
    )

NATURAL JOIN ist eine sehr bequeme Abkürzung für den Fall, weil (Zitat das Handbuch hier ):

EXISTS ist wahrscheinlich am schnellsten, da Postgres die Suche beendet, sobald das erste Duplikat gefunden wird. Da Sie höchstwahrscheinlich keinen Index haben, der die gesamte Zeile abdeckt, und Ihre Tabelle riesig ist, sparen Sie dadurch viel der Zeit.

Beachten Sie, dass NULL ist nie als identisch mit einem anderen NULL angesehen . Wenn Sie NULL haben Werte und betrachte sie als identisch, müssten Sie mehr tun.

ctid ist eine Systemspalte die als Ad-hoc-Primärschlüssel (missbraucht) werden können, aber auf Dauer keinen tatsächlichen benutzerdefinierten Primärschlüssel ersetzen können.

Die veraltete Version 8.1 scheint kein <> zu haben Operator definiert für eine ctid . Versuchen Sie, in text umzuwandeln :

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid::text <> t1.ctid::text
    )