sql >> Database teknologi >  >> RDS >> Mysql

Postgresl select count(*) tidskrævende

Den anden sætning tager lang tid, fordi den skal scanne hele tabellen for at tælle rækkerne.

En ting du kan gøre er at bruge et indeks:

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

Forudsat at id er den primære nøgle, ville det være meget bedre at bruge count(*) og udelad INCLUDE klausul fra indekset.

Men det bedste er nok at bruge et skøn:

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

Dette bruger distributionsstatistikken til at estimere det ønskede antal.

Hvis det kun handler om paginering, behøver du ikke nøjagtige optællinger.

Læs min blog for mere om emnet optælling i PostgreSQL.




  1. Tilføj masser af data med et vist tidsinterval i Java

  2. Tilføjelse af en kolonne som en fremmednøgle giver ERROR kolonne, der henvises til i fremmed nøgle begrænsning eksisterer ikke

  3. Parsing af ekstremt store XML-filer i php

  4. PDO output utf8 indsæt