Aby sprawdzić, czy jakikolwiek istnieje pełny duplikat (identyczny we wszystkich kolumnach), jest to prawdopodobnie najszybszy sposób:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURALNE DOŁĄCZENIE jest bardzo wygodnym skrótem w tej sprawie, ponieważ (cytując instrukcja tutaj
):
ISTNIEJE
jest prawdopodobnie najszybszy, ponieważ Postgres przestaje wyszukiwać po znalezieniu pierwszego duplikatu. Ponieważ najprawdopodobniej nie masz indeksu obejmującego cały wiersz, a Twoja tabela jest ogromna, zaoszczędzisz dużo czasu.
Pamiętaj, że NULL jest nigdy uważane za identyczne z innym NULL . Jeśli masz NULL wartości i uważaj je za identyczne, musisz zrobić więcej.
ctid to kolumna systemowa
który może być (nad)używany jako klucz podstawowy ad-hoc, ale na dłuższą metę nie może zastąpić rzeczywistego klucza podstawowego zdefiniowanego przez użytkownika.
Nieaktualna wersja 8.1 wydaje się nie mieć <> operator zdefiniowany dla ctid . Spróbuj przesłać do tekstu :
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)