sql >> Base de Datos >  >> RDS >> PostgreSQL

Buscar filas duplicadas completas en una tabla grande

Para saber si cualquiera existe un duplicado completo (idéntico en todas las columnas), esta es probablemente la forma más rápida:

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

NATURAL JOIN es una abreviatura muy conveniente para el caso porque (citando el manual aquí ):

EXISTS es probablemente el más rápido, porque Postgres deja de buscar tan pronto como se encuentra el primer duplicado. Dado que lo más probable es que no tenga un índice que cubra toda la fila y su tabla es enorme, esto le ahorrará mucho del tiempo.

Tenga en cuenta que NULL es nunca considerado idéntico a otro NULL . Si tiene NULL valores y los considera idénticos, tendría que hacer más.

ctid es una columna del sistema que se puede (ab-)utilizar como clave principal ad-hoc, pero no puede reemplazar una clave principal definida por el usuario real a largo plazo.

La versión obsoleta 8.1 parece no tener <> operador definido para un ctid . Intenta transmitir a text :

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