sql >> Databasteknik >  >> RDS >> Mysql

Postgresl select count(*) tidskrävande

Den andra satsen tar lång tid eftersom den måste skanna hela tabellen för att kunna räkna raderna.

En sak du kan göra är att använda ett index:

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

Förutsatt att id är den primära nyckeln skulle det vara mycket bättre att använda count(*) och utelämna INCLUDE klausul från indexet.

Men det bästa är nog att använda en uppskattning:

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 = ?;

Detta använder distributionsstatistiken för att uppskatta det önskade antalet.

Om det bara handlar om sidnumrering behöver du inga exakta antal.

Läs min blogg för mer om ämnet räkning i PostgreSQL.




  1. Kan jag styra GROUP BY i django 1.3:s orm?

  2. Hur man byter namn på en tabell i Microsoft Access

  3. Om RM-formatelementet i Oracle

  4. Hämta data för histogramplot