sql >> Databasteknik >  >> RDS >> PostgreSQL

Kontrollera om det finns kompletta dubbletter av rader i en stor tabell

För att ta reda på om någon full dubblett finns (identiskt på alla kolumner), detta är förmodligen det snabbaste sättet:

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

NATURLIG JOIN är en mycket bekväm förkortning för fallet eftersom (citerar manualen här ):

FINNS kod> är förmodligen snabbast, eftersom Postgres slutar söka så fort den första dubbletten hittas. Eftersom du förmodligen inte har ett index som täcker hela raden och ditt bord är enormt, kommer detta att spara dig mycket tid.

Tänk på att NULL är aldrig anses vara identisk med en annan NULL . Om du har NULL värderingar och betrakta dem som identiska, måste du göra mer.

ctid är en systemkolumn som kan (missbrukas) som ad-hoc primärnyckel, men inte kan ersätta en faktisk användardefinierad primärnyckel i det långa loppet.

Den föråldrade versionen 8.1 verkar inte ha någon <> operator definierad för en ctid . Testa att casta till text :

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


  1. MySQL-transaktioner och samtidiga insättningar

  2. Hur man ändrar standard MySQL/MariaDB-port i Linux

  3. Hur man förstår SQL Server Geografi Data Type

  4. Hur man använder php räkna ordparet (sträng) array infoga i MySQL