sql >> Database >  >> RDS >> Mysql

Postgresl select count(*) tijdrovend

Het tweede statement duurt lang omdat het de hele tabel moet scannen om de rijen te tellen.

Een ding dat u kunt doen, is een index gebruiken:

CREATE INDEX ON tbl_oplog (deleted) INCLUDE (id);
VACUUM tbl_oplog;  -- so you get an index only scan

Ervan uitgaande dat id de primaire sleutel is, zou het veel beter zijn om count(*) . te gebruiken en laat de INCLUDE . weg clausule uit de index.

Maar het beste is waarschijnlijk om een ​​schatting te gebruiken:

SELECT t.reltuples * freq.f AS estimated_rows
FROM pg_stats AS s
   JOIN pg_namespace AS n
      ON s.schemaname = n.nspname
   JOIN pg_class AS t
      ON s.tablename = t.relname
         AND n.oid = t.relnamespace
   CROSS JOIN LATERAL
      unnest(s.most_common_vals::text::boolean[]) WITH ORDINALITY AS val(v,id)
   JOIN LATERAL
      unnest(s.most_common_freqs) WITH ORDINALITY AS freq(f,id)
         USING (id)
WHERE s.tablename = 'tbl_oplog'
  AND s.attname = 'deleted'
  AND val.v = ?;

Dit gebruikt de distributiestatistieken om het gewenste aantal te schatten.

Als het alleen om paginering gaat, heb je geen exacte tellingen nodig.

Lees mijn blog voor meer informatie over tellen in PostgreSQL.




  1. Een lijst met partitiefuncties retourneren in SQL Server (T-SQL)

  2. Sharding en ID-generatie als instagram

  3. Bool-ondersteuning Oracle SQL

  4. Manier om de uitvoering van MySQL-scripts af te breken (misschien een foutmelding)?