mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
abaffa9075
blbuildempty did not do even approximately the right thing: it tried to add a metapage to the relation's regular data fork, which already has one at that point. It should look like the ambuildempty methods for all the standard index types, ie, initialize a metapage image in some transient storage and then write it directly to the init fork. To support that, refactor BloomInitMetapage into two functions. In passing, fix BloomInitMetapage so it doesn't leave the rd_options field of the index's relcache entry pointing at transient storage. I'm not sure this had any visible consequence, since nothing much else is likely to look at a bloom index's rd_options, but it's certainly poor practice. Per bug #14155 from Zhou Digoal. Report: <20160524144146.22598.42558@wrigleys.postgresql.org>
213 lines
4.6 KiB
Plaintext
213 lines
4.6 KiB
Plaintext
CREATE EXTENSION bloom;
|
|
CREATE TABLE tst (
|
|
i int4,
|
|
t text
|
|
);
|
|
INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
|
|
CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);
|
|
SET enable_seqscan=on;
|
|
SET enable_bitmapscan=off;
|
|
SET enable_indexscan=off;
|
|
SELECT count(*) FROM tst WHERE i = 7;
|
|
count
|
|
-------
|
|
200
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE t = '5';
|
|
count
|
|
-------
|
|
112
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE i = 7 AND t = '5';
|
|
count
|
|
-------
|
|
13
|
|
(1 row)
|
|
|
|
SET enable_seqscan=off;
|
|
SET enable_bitmapscan=on;
|
|
SET enable_indexscan=on;
|
|
EXPLAIN (COSTS OFF) SELECT count(*) FROM tst WHERE i = 7;
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Aggregate
|
|
-> Bitmap Heap Scan on tst
|
|
Recheck Cond: (i = 7)
|
|
-> Bitmap Index Scan on bloomidx
|
|
Index Cond: (i = 7)
|
|
(5 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT count(*) FROM tst WHERE t = '5';
|
|
QUERY PLAN
|
|
-------------------------------------------
|
|
Aggregate
|
|
-> Bitmap Heap Scan on tst
|
|
Recheck Cond: (t = '5'::text)
|
|
-> Bitmap Index Scan on bloomidx
|
|
Index Cond: (t = '5'::text)
|
|
(5 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT count(*) FROM tst WHERE i = 7 AND t = '5';
|
|
QUERY PLAN
|
|
---------------------------------------------------------
|
|
Aggregate
|
|
-> Bitmap Heap Scan on tst
|
|
Recheck Cond: ((i = 7) AND (t = '5'::text))
|
|
-> Bitmap Index Scan on bloomidx
|
|
Index Cond: ((i = 7) AND (t = '5'::text))
|
|
(5 rows)
|
|
|
|
SELECT count(*) FROM tst WHERE i = 7;
|
|
count
|
|
-------
|
|
200
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE t = '5';
|
|
count
|
|
-------
|
|
112
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE i = 7 AND t = '5';
|
|
count
|
|
-------
|
|
13
|
|
(1 row)
|
|
|
|
DELETE FROM tst;
|
|
INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
|
|
VACUUM ANALYZE tst;
|
|
SELECT count(*) FROM tst WHERE i = 7;
|
|
count
|
|
-------
|
|
200
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE t = '5';
|
|
count
|
|
-------
|
|
112
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE i = 7 AND t = '5';
|
|
count
|
|
-------
|
|
13
|
|
(1 row)
|
|
|
|
DELETE FROM tst WHERE i > 1 OR t = '5';
|
|
VACUUM tst;
|
|
INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
|
|
SELECT count(*) FROM tst WHERE i = 7;
|
|
count
|
|
-------
|
|
200
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE t = '5';
|
|
count
|
|
-------
|
|
112
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE i = 7 AND t = '5';
|
|
count
|
|
-------
|
|
13
|
|
(1 row)
|
|
|
|
VACUUM FULL tst;
|
|
SELECT count(*) FROM tst WHERE i = 7;
|
|
count
|
|
-------
|
|
200
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE t = '5';
|
|
count
|
|
-------
|
|
112
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tst WHERE i = 7 AND t = '5';
|
|
count
|
|
-------
|
|
13
|
|
(1 row)
|
|
|
|
-- Try an unlogged table too
|
|
CREATE UNLOGGED TABLE tstu (
|
|
i int4,
|
|
t text
|
|
);
|
|
INSERT INTO tstu SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
|
|
CREATE INDEX bloomidxu ON tstu USING bloom (i, t) WITH (col2 = 4);
|
|
SET enable_seqscan=off;
|
|
SET enable_bitmapscan=on;
|
|
SET enable_indexscan=on;
|
|
EXPLAIN (COSTS OFF) SELECT count(*) FROM tstu WHERE i = 7;
|
|
QUERY PLAN
|
|
--------------------------------------------
|
|
Aggregate
|
|
-> Bitmap Heap Scan on tstu
|
|
Recheck Cond: (i = 7)
|
|
-> Bitmap Index Scan on bloomidxu
|
|
Index Cond: (i = 7)
|
|
(5 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT count(*) FROM tstu WHERE t = '5';
|
|
QUERY PLAN
|
|
--------------------------------------------
|
|
Aggregate
|
|
-> Bitmap Heap Scan on tstu
|
|
Recheck Cond: (t = '5'::text)
|
|
-> Bitmap Index Scan on bloomidxu
|
|
Index Cond: (t = '5'::text)
|
|
(5 rows)
|
|
|
|
EXPLAIN (COSTS OFF) SELECT count(*) FROM tstu WHERE i = 7 AND t = '5';
|
|
QUERY PLAN
|
|
---------------------------------------------------------
|
|
Aggregate
|
|
-> Bitmap Heap Scan on tstu
|
|
Recheck Cond: ((i = 7) AND (t = '5'::text))
|
|
-> Bitmap Index Scan on bloomidxu
|
|
Index Cond: ((i = 7) AND (t = '5'::text))
|
|
(5 rows)
|
|
|
|
SELECT count(*) FROM tstu WHERE i = 7;
|
|
count
|
|
-------
|
|
200
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tstu WHERE t = '5';
|
|
count
|
|
-------
|
|
112
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM tstu WHERE i = 7 AND t = '5';
|
|
count
|
|
-------
|
|
13
|
|
(1 row)
|
|
|
|
RESET enable_seqscan;
|
|
RESET enable_bitmapscan;
|
|
RESET enable_indexscan;
|
|
-- Run amvalidator function on our opclasses
|
|
SELECT opcname, amvalidate(opc.oid)
|
|
FROM pg_opclass opc JOIN pg_am am ON am.oid = opcmethod
|
|
WHERE amname = 'bloom'
|
|
ORDER BY 1;
|
|
opcname | amvalidate
|
|
----------+------------
|
|
int4_ops | t
|
|
text_ops | t
|
|
(2 rows)
|
|
|