Para descobrir se algum existe duplicata completa (idêntica em todas as colunas), esta é provavelmente a maneira mais rápida:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
UNIÇÃO NATURAL
é uma abreviação muito conveniente para o caso porque (citando o manual aqui
):EXISTS
é provavelmente o mais rápido, porque o Postgres para de pesquisar assim que a primeira duplicata é encontrada. Como você provavelmente não tem um índice cobrindo toda a linha e sua tabela é enorme, isso economizará muito de tempo. Esteja ciente de que
NULL
é nunca considerado idêntico a outro NULL
. Se você tiver NULL
valores e considerá-los idênticos, você teria que fazer mais. ctid
é uma coluna do sistema
que pode ser (ab-)usado como chave primária ad-hoc, mas não pode substituir uma chave primária real definida pelo usuário a longo prazo. A versão desatualizada 8.1 parece não ter
<>
operador definido para um ctid
. Tente transmitir para text
:SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)