Chcete-li zjistit, zda nějaké existuje úplný duplikát (stejný ve všech sloupcích), toto je pravděpodobně nejrychlejší způsob:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
je velmi výhodná zkratka pro tento případ, protože (cituji manuál zde
):
EXISTUJE
je pravděpodobně nejrychlejší, protože Postgres přestane hledat, jakmile je nalezen první duplikát. Protože s největší pravděpodobností nemáte index pokrývající celý řádek a vaše tabulka je obrovská, ušetříte tím hodně času.
Uvědomte si, že NULL
je nikdy považováno za identické s jiným NULL
. Pokud máte NULL
hodnoty a považovat je za identické, museli byste udělat více.
ctid
je systémový sloupec
který lze (ab-) použít jako primární klíč ad-hoc, ale nemůže z dlouhodobého hlediska nahradit skutečný primární klíč definovaný uživatelem.
Zdá se, že zastaralá verze 8.1 nemá žádný <>
operátor definovaný pro ctid
. Zkuste přenést do textu
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)