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
)