PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Vérifier les lignes en double complètes dans une grande table

Pour savoir si tout le doublon complet existe (identique sur toutes les colonnes), c'est probablement le moyen le plus rapide :

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

NATURAL JOIN est un raccourci très pratique pour le cas car (en citant le manuel ici ):

EXISTS est probablement le plus rapide, car Postgres arrête la recherche dès que le premier doublon est trouvé. Étant donné que vous n'avez probablement pas d'index couvrant toute la ligne et que votre table est énorme, cela vous fera économiser beaucoup de temps.

Soyez conscient que NULL n'est jamais considéré comme identique à un autre NULL . Si vous avez NULL valeurs et considérez-les comme identiques, vous devrez faire plus.

ctid est une colonne système qui peut être (ab-)utilisée comme clé primaire ad-hoc, mais ne peut pas remplacer une clé primaire réelle définie par l'utilisateur à long terme.

La version obsolète 8.1 semble ne pas avoir de <> opérateur défini pour un ctid . Essayez de caster en text :

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