PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Verifica la presenza di righe duplicate complete in una tabella di grandi dimensioni

Per scoprire se qualsiasi esiste un duplicato completo (identico su tutte le colonne), questo è probabilmente il modo più veloce:

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

NATURAL JOIN è una scorciatoia molto conveniente per il caso perché (citando il manuale qui ):

EXISTS è probabilmente il più veloce, perché Postgres interrompe la ricerca non appena viene trovato il primo duplicato. Dal momento che molto probabilmente non hai un indice che copre l'intera riga e la tua tabella è enorme, questo ti farà risparmiare molto di tempo.

Tieni presente che NULL è mai considerato identico a un altro NULL . Se hai NULL valori e considerali identici, dovresti fare di più.

ctid è una colonna di sistema che può essere (ab-)utilizzato come chiave primaria ad hoc, ma non può sostituire una vera chiave primaria definita dall'utente a lungo termine.

La versione obsoleta 8.1 sembra non avere <> operatore definito per un ctid . Prova a trasmettere a text :

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