Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Postgresl select count(*) czasochłonne

Druga instrukcja zajmuje dużo czasu, ponieważ musi przeskanować całą tabelę, aby policzyć wiersze.

Jedyne, co możesz zrobić, to użyć indeksu:

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

Zakładając, że id jest kluczem podstawowym, znacznie lepiej byłoby użyć count(*) i pomiń INCLUDE klauzula z indeksu.

Ale najlepiej jest prawdopodobnie użyć oszacowania:

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

Wykorzystuje statystyki dystrybucji do oszacowania żądanej liczby.

Jeśli chodzi tylko o paginację, nie potrzebujesz dokładnych obliczeń.

Przeczytaj mojego bloga aby dowiedzieć się więcej na temat liczenia w PostgreSQL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozszerzyć Joomla! do mojego niestandardowego pliku PHP

  2. Grupuj według wartości RAND()

  3. Jak podzielić informacje mySQL, aby były wyświetlane w kolumnach HTML

  4. Czy istnieje odpowiednik MySQL preg_replace PHP?

  5. Wyszukaj wartość w kolumnie BLOB w MySQL