PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Verifique se há linhas duplicadas completas em uma tabela grande


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
    )