Hello, I am toying around with 9.2.1, trying to measure/determine how index-only scans can improve our performance. A small script which is attached to this mail, shows that as long as the table has been VACUUM FULL'd, there is a unusual high amount of heap fetches. It is strange that the visibilitymap_test predicate fails in these situations, is the visibility map somehow trashed in this situation? It should not, or at least the documentation[1] should state it (my understanding is that vacuum full does *more* than vacuum, but nothing less) (note to usual anti vacuum full trollers: I know you hate vacuum full). Using pg 9.2.1 compiled from sources, almost standard configuration except shared_buffers at 512M, effective_cache_size at 1536M, random_page_cost at 2, and vacuum delays increased. Please find complete logs attached, and selected logs below: After table creation + analyze: Index Only Scan using i on ta (cost=0.00..156991.10 rows=2018667 width=4) (actual time=0.034..336.443 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 2000000 After vacuum: Index Only Scan using i on ta (cost=0.00..50882.62 rows=2018667 width=4) (actual time=0.014..193.120 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 0 After vacuum analyze: Index Only Scan using i on ta (cost=0.00..50167.13 rows=1990353 width=4) (actual time=0.015..193.035 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 0 After vacuum full: Index Only Scan using i on ta (cost=0.00..155991.44 rows=1990333 width=4) (actual time=0.042..364.412 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 2000000 ^^^^^^^ uh uh, looking bad After vacuum full analyze: Index Only Scan using i on ta (cost=0.00..157011.85 rows=2030984 width=4) (actual time=0.025..365.657 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 2000000 After vacuum: Index Only Scan using i on ta (cost=0.00..51192.45 rows=2031000 width=4) (actual time=0.015..192.520 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 0 Thanks for any comments/hints, Ref: [1] http://www.postgresql.org/docs/9.1/static/sql-vacuum.html
Attachment:
vacfull.sql
Description: Binary data
DROP TABLE ta; psql:/tmp/vacfull.sql:3: ERROR: table "ta" does not exist CREATE TABLE ta (ca int, cb int, cc int); CREATE TABLE INSERT INTO ta VALUES (generate_series(1, 5), generate_series(1, 10000000), generate_series(1, 10000000)); INSERT 0 10000000 ANALYZE ta; ANALYZE CREATE INDEX i ON ta (ca, cb, cc); CREATE INDEX EXPLAIN ANALYZE SELECT cb FROM ta WHERE ca = 1 ORDER BY cb; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ Index Only Scan using i on ta (cost=0.00..156991.10 rows=2018667 width=4) (actual time=0.034..336.443 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 2000000 Total runtime: 385.023 ms (4 rows) VACUUM ta; VACUUM EXPLAIN ANALYZE SELECT cb FROM ta WHERE ca = 1 ORDER BY cb; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Index Only Scan using i on ta (cost=0.00..50882.62 rows=2018667 width=4) (actual time=0.014..193.120 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 0 Total runtime: 241.079 ms (4 rows) VACUUM ANALYZE ta; VACUUM EXPLAIN ANALYZE SELECT cb FROM ta WHERE ca = 1 ORDER BY cb; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Index Only Scan using i on ta (cost=0.00..50167.13 rows=1990353 width=4) (actual time=0.015..193.035 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 0 Total runtime: 241.101 ms (4 rows) VACUUM FULL ta; VACUUM EXPLAIN ANALYZE SELECT cb FROM ta WHERE ca = 1 ORDER BY cb; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ Index Only Scan using i on ta (cost=0.00..155991.44 rows=1990333 width=4) (actual time=0.042..364.412 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 2000000 Total runtime: 412.715 ms (4 rows) VACUUM FULL ANALYZE ta; VACUUM EXPLAIN ANALYZE SELECT cb FROM ta WHERE ca = 1 ORDER BY cb; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ Index Only Scan using i on ta (cost=0.00..157011.85 rows=2030984 width=4) (actual time=0.025..365.657 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 2000000 Total runtime: 414.223 ms (4 rows) VACUUM ta; VACUUM EXPLAIN ANALYZE SELECT cb FROM ta WHERE ca = 1 ORDER BY cb; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Index Only Scan using i on ta (cost=0.00..51192.45 rows=2031000 width=4) (actual time=0.015..192.520 rows=2000000 loops=1) Index Cond: (ca = 1) Heap Fetches: 0 Total runtime: 240.918 ms (4 rows) DROP TABLE ta; DROP TABLE
-- Guillaume Cottenceau
-- Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-performance