sql >> Database >  >> RDS >> PostgreSQL

Controleer op volledige dubbele rijen in een grote tabel

Om te zien of een volledig duplicaat bestaat (identiek op alle kolommen), dit is waarschijnlijk de snelste manier:

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

NATURAL JOIN is een erg handige afkorting voor de zaak omdat (onder vermelding van de handleiding hier ):

EXISTS is waarschijnlijk het snelst, omdat Postgres stopt met zoeken zodra het eerste duplicaat is gevonden. Aangezien je hoogstwaarschijnlijk geen index hebt die de hele rij dekt en je tabel enorm is, zal dit je veel besparen. tijd.

Houd er rekening mee dat NULL is nooit beschouwd als identiek aan een andere NULL . Als u NULL . heeft waarden en ze als identiek beschouwen, zou je meer moeten doen.

ctid is een systeemkolom die kan worden (misbruikt) als ad-hoc primaire sleutel, maar kan op de lange termijn niet een daadwerkelijke door de gebruiker gedefinieerde primaire sleutel vervangen.

De verouderde versie 8.1 lijkt geen <> . te hebben operator gedefinieerd voor een ctid . Probeer te casten naar text :

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


  1. Postgresql opgeslagen procedure retourneert tabel alle kolommen

  2. Kan ik een standaardschema instellen voor binnen een opgeslagen procedure?

  3. Hoe te sorteren in SQL

  4. MySQL-groepsrijen om tijdsverschil te vinden