-- throw in some NULL's and different values INSERTINTO brintest_bloom (inetcol, cidrcol) SELECT
inet 'fe80::6e40:8ff:fea9:8c46' + tenthous,
cidr 'fe80::6e40:8ff:fea9:8c46' + tenthous FROM tenk1 ORDERBY thousand, tenthous LIMIT25;
-- test bloom specific index options -- ndistinct must be >= -1.0 CREATEINDEX brinidx_bloom ON brintest_bloom USING brin (
byteacol bytea_bloom_ops(n_distinct_per_range = -1.1)
); -- false_positive_rate must be between 0.0001 and 0.25 CREATEINDEX brinidx_bloom ON brintest_bloom USING brin (
byteacol bytea_bloom_ops(false_positive_rate = 0.00009)
); CREATEINDEX brinidx_bloom ON brintest_bloom USING brin (
byteacol bytea_bloom_ops(false_positive_rate = 0.26)
);
DO $x$ DECLARE
r record;
r2 record;
cond text;
idx_ctids tid[];
ss_ctids tid[];
count int;
plan_ok bool;
plan_line text;
BEGIN FOR r INSELECT colname, oper, typ, value[ordinality], matches[ordinality] FROM brinopers_bloom, unnest(op) WITH ORDINALITY AS oper LOOP
-- prepare the condition IF r.value ISNULLTHEN
cond := format('%I %s %L', r.colname, r.oper, r.value); ELSE
cond := format('%I %s %L::%s', r.colname, r.oper, r.value, r.typ);
END IF;
-- run the query using the brin index SET enable_seqscan = 0; SET enable_bitmapscan = 1;
plan_ok := false; FOR plan_line IN EXECUTE format($y$EXPLAINSELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) LOOP IF plan_line LIKE'%Bitmap Heap Scan on brintest_bloom%'THEN
plan_ok := true;
END IF;
END LOOP; IFNOT plan_ok THEN
RAISE WARNING 'did not get bitmap indexscan plan for %', r;
END IF;
EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) INTO idx_ctids;
-- run the query using a seqscan SET enable_seqscan = 1; SET enable_bitmapscan = 0;
plan_ok := false; FOR plan_line IN EXECUTE format($y$EXPLAINSELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) LOOP IF plan_line LIKE'%Seq Scan on brintest_bloom%'THEN
plan_ok := true;
END IF;
END LOOP; IFNOT plan_ok THEN
RAISE WARNING 'did not get seqscan plan for %', r;
END IF;
EXECUTE format($y$SELECT array_agg(ctid) FROM brintest_bloom WHERE %s $y$, cond) INTO ss_ctids;
-- make sure both return the same results
count := array_length(idx_ctids, 1);
IFNOT (count = array_length(ss_ctids, 1) AND
idx_ctids @> ss_ctids AND
idx_ctids <@ ss_ctids) THEN -- report the results of each scan to make the differences obvious
RAISE WARNING 'something not right in %: count %', r, count; SET enable_seqscan = 1; SET enable_bitmapscan = 0; FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_bloom WHERE ' || cond LOOP
RAISE NOTICE 'seqscan: %', r2;
END LOOP;
SET enable_seqscan = 0; SET enable_bitmapscan = 1; FOR r2 IN EXECUTE 'SELECT ' || r.colname || ' FROM brintest_bloom WHERE ' || cond LOOP
RAISE NOTICE 'bitmapscan: %', r2;
END LOOP;
END IF;
-- make sure we found expected number of matches IF count != r.matches THEN RAISE WARNING 'unexpected number of results % for %', count, r; END IF;
END LOOP;
END;
$x$;
SELECT brin_desummarize_range('brinidx_bloom', 0);
VACUUM brintest_bloom; -- force a summarization cycle in brinidx
UPDATE brintest_bloom SET int8col = int8col * int4col; UPDATE brintest_bloom SET textcol = ''WHERE textcol ISNOTNULL;
-- Tests for brin_summarize_new_values SELECT brin_summarize_new_values('brintest_bloom'); -- error, not an index SELECT brin_summarize_new_values('tenk1_unique1'); -- error, not a BRIN index SELECT brin_summarize_new_values('brinidx_bloom'); -- ok, no change expected
-- Tests for brin_desummarize_range SELECT brin_desummarize_range('brinidx_bloom', -1); -- error, invalid range SELECT brin_desummarize_range('brinidx_bloom', 0); SELECT brin_desummarize_range('brinidx_bloom', 0); SELECT brin_desummarize_range('brinidx_bloom', 100000000);
-- Test brin_summarize_range CREATETABLE brin_summarize_bloom (
value int
) WITH (fillfactor=10, autovacuum_enabled=false); CREATEINDEX brin_summarize_bloom_idx ON brin_summarize_bloom USING brin (value) WITH (pages_per_range=2); -- Fill a few pages
DO $$ DECLARE curtid tid;
BEGIN LOOP INSERTINTO brin_summarize_bloom VALUES (1) RETURNING ctid INTO curtid; EXITWHEN curtid > tid '(2, 0)';
END LOOP;
END;
$$;
-- summarize one range SELECT brin_summarize_range('brin_summarize_bloom_idx', 0); -- nothing: already summarized SELECT brin_summarize_range('brin_summarize_bloom_idx', 1); -- summarize one range SELECT brin_summarize_range('brin_summarize_bloom_idx', 2); -- nothing: page doesn't exist in table SELECT brin_summarize_range('brin_summarize_bloom_idx', 4294967295); -- invalid block number values SELECT brin_summarize_range('brin_summarize_bloom_idx', -1); SELECT brin_summarize_range('brin_summarize_bloom_idx', 4294967296);
-- test brin cost estimates behave sanely based on correlation of values CREATETABLE brin_test_bloom (a INT, b INT); INSERTINTO brin_test_bloom SELECT x/100,x%100FROM generate_series(1,10000) x(x); CREATEINDEX brin_test_bloom_a_idx ON brin_test_bloom USING brin (a) WITH (pages_per_range = 2); CREATEINDEX brin_test_bloom_b_idx ON brin_test_bloom USING brin (b) WITH (pages_per_range = 2);
VACUUM ANALYZE brin_test_bloom;
-- Ensure brin index is used when columns are perfectly correlated EXPLAIN (COSTS OFF) SELECT * FROM brin_test_bloom WHERE a = 1; -- Ensure brin index is not used when values are not correlated EXPLAIN (COSTS OFF) SELECT * FROM brin_test_bloom WHERE b = 1;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.