sql >> Databáze >  >> RDS >> Mysql

Postgresl select count(*) je časově náročný

Druhý příkaz trvá dlouho, protože musí prohledat celou tabulku, aby bylo možné spočítat řádky.

Jedna věc, kterou můžete udělat, je použít index:

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

Za předpokladu, že id je primární klíč, bylo by mnohem lepší použít count(*) a vynechat INCLUDE klauzule z indexu.

Ale nejlepší je asi použít odhad:

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

To využívá statistiky distribuce k odhadu požadovaného počtu.

Pokud jde pouze o stránkování, nepotřebujete přesné počty.

Přečtěte si můj blog více na téma počítání v PostgreSQL.




  1. Problém s kódováním Unicode v Pythonu

  2. SQL - Odebrat závorku z telefonního čísla

  3. MySQL a Java - Získejte ID poslední vložené hodnoty (JDBC)

  4. Nejlepší ETL nástroje pro migraci na PostgreSQL