Add very basic test for kill_prior_tuples

Previously our tests did not exercise kill_prior_tuples for hash and gist. For
gist some related paths were reached, but gist's implementation seems to not
work if all the dead tuples are on one page (or something like that). The
coverage for other index types was rather incidental.

Thus add an explicit test ensuring kill_prior_tuples works at all.

Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://postgr.es/m/lxzj26ga6ippdeunz6kuncectr5gfuugmm2ry22qu6hcx6oid6@lzx3sjsqhmt6
pull/239/head
Andres Freund 1 month ago
parent 21fddb3d76
commit 377b7ab145
  1. 355
      src/test/isolation/expected/index-killtuples.out
  2. 1
      src/test/isolation/isolation_schedule
  3. 127
      src/test/isolation/specs/index-killtuples.spec

@ -0,0 +1,355 @@
Parsed test spec with 1 sessions
starting permutation: create_table fill_500 create_btree flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table
step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
step create_btree: CREATE INDEX kill_prior_tuple_btree ON kill_prior_tuple USING btree (key);
step flush: SELECT FROM pg_stat_force_next_flush();
step disable_seq: SET enable_seqscan = false;
step disable_bitmap: SET enable_bitmapscan = false;
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
--------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
--------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step delete: DELETE FROM kill_prior_tuple;
step flush: SELECT FROM pg_stat_force_next_flush();
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
--------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
--------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
0
(1 row)
step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
starting permutation: create_table fill_500 create_ext_btree_gist create_gist flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table drop_ext_btree_gist
step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
step create_ext_btree_gist: CREATE EXTENSION btree_gist;
step create_gist: CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key);
step flush: SELECT FROM pg_stat_force_next_flush();
step disable_seq: SET enable_seqscan = false;
step disable_bitmap: SET enable_bitmapscan = false;
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step delete: DELETE FROM kill_prior_tuple;
step flush: SELECT FROM pg_stat_force_next_flush();
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
0
(1 row)
step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
step drop_ext_btree_gist: DROP EXTENSION btree_gist;
starting permutation: create_table fill_10 create_ext_btree_gist create_gist flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table drop_ext_btree_gist
step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
step fill_10: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 10) g(i);
step create_ext_btree_gist: CREATE EXTENSION btree_gist;
step create_gist: CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key);
step flush: SELECT FROM pg_stat_force_next_flush();
step disable_seq: SET enable_seqscan = false;
step disable_bitmap: SET enable_bitmapscan = false;
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step delete: DELETE FROM kill_prior_tuple;
step flush: SELECT FROM pg_stat_force_next_flush();
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
step drop_ext_btree_gist: DROP EXTENSION btree_gist;
starting permutation: create_table fill_500 create_hash flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table
step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
step create_hash: CREATE INDEX kill_prior_tuple_hash ON kill_prior_tuple USING hash (key);
step flush: SELECT FROM pg_stat_force_next_flush();
step disable_seq: SET enable_seqscan = false;
step disable_bitmap: SET enable_bitmapscan = false;
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step delete: DELETE FROM kill_prior_tuple;
step flush: SELECT FROM pg_stat_force_next_flush();
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=0.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(3 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
0
(1 row)
step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
starting permutation: create_table fill_500 create_ext_btree_gin create_gin flush disable_seq delete flush measure access flush result measure access flush result drop_table drop_ext_btree_gin
step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
step create_ext_btree_gin: CREATE EXTENSION btree_gin;
step create_gin: CREATE INDEX kill_prior_tuple_gin ON kill_prior_tuple USING gin (key);
step flush: SELECT FROM pg_stat_force_next_flush();
step disable_seq: SET enable_seqscan = false;
step delete: DELETE FROM kill_prior_tuple;
step flush: SELECT FROM pg_stat_force_next_flush();
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
--------------------------------------------------------------------------
Bitmap Heap Scan on kill_prior_tuple (actual rows=0.00 loops=1)
Recheck Cond: (key = 1)
Heap Blocks: exact=1
-> Bitmap Index Scan on kill_prior_tuple_gin (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(6 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
QUERY PLAN
--------------------------------------------------------------------------
Bitmap Heap Scan on kill_prior_tuple (actual rows=0.00 loops=1)
Recheck Cond: (key = 1)
Heap Blocks: exact=1
-> Bitmap Index Scan on kill_prior_tuple_gin (actual rows=1.00 loops=1)
Index Cond: (key = 1)
Index Searches: 1
(6 rows)
step flush: SELECT FROM pg_stat_force_next_flush();
step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
new_heap_accesses
-----------------
1
(1 row)
step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
step drop_ext_btree_gin: DROP EXTENSION btree_gin;

@ -16,6 +16,7 @@ test: ri-trigger
test: partial-index
test: two-ids
test: multiple-row-versions
test: index-killtuples
test: index-only-scan
test: index-only-bitmapscan
test: predicate-lock-hot-tuple

@ -0,0 +1,127 @@
# Basic testing of killtuples / kill_prior_tuples / all_dead testing
# for various index AMs
#
# This tests just enough to ensure that the kill* routines are actually
# executed and does something approximately reasonable. It's *not* sufficient
# testing for adding killitems support to a new AM!
#
# This doesn't really need to be an isolation test, it could be written as a
# regular regression test. However, writing it as an isolation test ends up a
# *lot* less verbose.
setup
{
CREATE TABLE counter(heap_accesses int);
INSERT INTO counter(heap_accesses) VALUES (0);
}
teardown
{
DROP TABLE counter;
}
session s1
# to ensure GUCs are reset
setup { RESET ALL; }
step disable_seq { SET enable_seqscan = false; }
step disable_bitmap { SET enable_bitmapscan = false; }
# use a temporary table to make sure no other session can interfere with
# visibility determinations
step create_table { CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null); }
step fill_10 { INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 10) g(i); }
step fill_500 { INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i); }
# column-less select to make output easier to read
step flush { SELECT FROM pg_stat_force_next_flush(); }
step measure { UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple'); }
step result { SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple'; }
step access { EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1; }
step delete { DELETE FROM kill_prior_tuple; }
step drop_table { DROP TABLE IF EXISTS kill_prior_tuple; }
### steps for testing btree indexes ###
step create_btree { CREATE INDEX kill_prior_tuple_btree ON kill_prior_tuple USING btree (key); }
### steps for testing gist indexes ###
# Creating the extensions takes time, so we don't want to do so when testing
# other AMs
step create_ext_btree_gist { CREATE EXTENSION btree_gist; }
step drop_ext_btree_gist { DROP EXTENSION btree_gist; }
step create_gist { CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key); }
### steps for testing gin indexes ###
# See create_ext_btree_gist
step create_ext_btree_gin { CREATE EXTENSION btree_gin; }
step drop_ext_btree_gin { DROP EXTENSION btree_gin; }
step create_gin { CREATE INDEX kill_prior_tuple_gin ON kill_prior_tuple USING gin (key); }
### steps for testing hash indexes ###
step create_hash { CREATE INDEX kill_prior_tuple_hash ON kill_prior_tuple USING hash (key); }
# test killtuples with btree index
permutation
create_table fill_500 create_btree flush
disable_seq disable_bitmap
# show each access to non-deleted tuple increments heap_blks_*
measure access flush result
measure access flush result
delete flush
# first access after accessing deleted tuple still needs to access heap
measure access flush result
# but after kill_prior_tuple did its thing, we shouldn't access heap anymore
measure access flush result
drop_table
# Same as first permutation, except testing gist
permutation
create_table fill_500 create_ext_btree_gist create_gist flush
disable_seq disable_bitmap
measure access flush result
measure access flush result
delete flush
measure access flush result
measure access flush result
drop_table drop_ext_btree_gist
# Test gist, but with fewer rows - shows that killitems doesn't work anymore!
permutation
create_table fill_10 create_ext_btree_gist create_gist flush
disable_seq disable_bitmap
measure access flush result
measure access flush result
delete flush
measure access flush result
measure access flush result
drop_table drop_ext_btree_gist
# Same as first permutation, except testing hash
permutation
create_table fill_500 create_hash flush
disable_seq disable_bitmap
measure access flush result
measure access flush result
delete flush
measure access flush result
measure access flush result
drop_table
# # Similar to first permutation, except that gin does not have killtuples support
permutation
create_table fill_500 create_ext_btree_gin create_gin flush
disable_seq
delete flush
measure access flush result
# will still fetch from heap
measure access flush result
drop_table drop_ext_btree_gin
Loading…
Cancel
Save