11CREATE TABLE test_boxes (
22 b sbox
33);
4- COPY test_boxes (b) FROM stdin;
4+ CREATE TABLE test_boxes_tmp (
5+ b sbox
6+ );
7+ COPY test_boxes_tmp (b) FROM stdin;
8+ DO $$
9+ DECLARE
10+ idx INT := 0;
11+ BEGIN
12+ WHILE idx < 1000 LOOP
13+ INSERT INTO test_boxes(b) SELECT b FROM test_boxes_tmp;
14+ idx := idx + 1;
15+ END LOOP;
16+ END $$;
17+ SELECT 'test_boxes_tmp' as "# rows", COUNT(*) FROM test_boxes_tmp
18+ UNION ALL
19+ SELECT 'test_boxes', COUNT(*) FROM test_boxes;
20+ # rows | count
21+ ----------------+-------
22+ test_boxes_tmp | 77
23+ test_boxes | 77000
24+ (2 rows)
25+
526CREATE OR REPLACE FUNCTION qnodes(q text) RETURNS text
627LANGUAGE 'plpgsql' AS
728$$
@@ -23,64 +44,92 @@ BEGIN
2344 RETURN array_to_string(ret,',');
2445END;
2546$$;
26- CREATE INDEX test_boxes_idx ON test_boxes USING brin (b) WITH (pages_per_range = 16);
27- set enable_indexscan = off;
28- set enable_bitmapscan = off;
29- set enable_seqscan = on;
47+ CREATE INDEX test_boxes_gist_idx ON test_boxes USING gist(b);
48+ CLUSTER test_boxes USING test_boxes_gist_idx;
49+ \d+ test_boxes;
50+ Table "public.test_boxes"
51+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
52+ --------+------+-----------+----------+---------+---------+--------------+-------------
53+ b | sbox | | | | plain | |
54+ Indexes:
55+ "test_boxes_gist_idx" gist (b) CLUSTER
56+
57+ DROP INDEX test_boxes_gist_idx;
58+ VACUUM FULL;
59+ VACUUM ANALYZE;
60+ CREATE INDEX test_boxes_idx ON test_boxes USING brin (b);
61+ \d+ test_boxes;
62+ Table "public.test_boxes"
63+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
64+ --------+------+-----------+----------+---------+---------+--------------+-------------
65+ b | sbox | | | | plain | |
66+ Indexes:
67+ "test_boxes_idx" brin (b)
68+
69+ SELECT COUNT(*) FROM test_boxes;
70+ count
71+ -------
72+ 77000
73+ (1 row)
74+
75+ SET enable_indexscan = OFF;
76+ SET enable_bitmapscan = OFF;
77+ SET enable_seqscan = ON;
3078SELECT 'scan_seq', qnodes('SELECT * FROM test_boxes WHERE b <@ sbox ''( (10d,10d), (20d,20d) )''');
3179 ?column? | qnodes
3280----------+----------
3381 scan_seq | Seq Scan
3482(1 row)
3583
36- SELECT * FROM test_boxes WHERE b <@ sbox '( (10d,10d), (20d,20d) )';
37- b
38- ---
39- (0 rows)
84+ SELECT COUNT(*) FROM test_boxes WHERE b <@ sbox '( (10d,10d), (20d,20d) )';
85+ count
86+ -------
87+ 0
88+ (1 row)
4089
4190SELECT 'scan_seq', qnodes('SELECT * FROM test_boxes WHERE b && sbox ''( (10d,10d), (20d,20d) )''');
4291 ?column? | qnodes
4392----------+----------
4493 scan_seq | Seq Scan
4594(1 row)
4695
47- SELECT * FROM test_boxes WHERE b && sbox '( (10d,10d), (20d,20d) )';
48- b
49- ------------------------------------------------------------------------------------
50- ((0.349065850398866 , 0.174532925199433), (0.350065850398866 , 0.174632925199433))
96+ SELECT COUNT(*) FROM test_boxes WHERE b && sbox '( (10d,10d), (20d,20d) )';
97+ count
98+ -------
99+ 1000
51100(1 row)
52101
53- set enable_indexscan = off ;
54- set enable_bitmapscan = on ;
55- set enable_seqscan = off ;
102+ SET enable_indexscan = OFF ;
103+ SET enable_bitmapscan = ON ;
104+ SET enable_seqscan = OFF ;
56105SELECT 'scan_idx', qnodes('SELECT * FROM test_boxes WHERE b <@ sbox ''( (10d,10d), (20d,20d) )''');
57106 ?column? | qnodes
58107----------+----------
59108 scan_idx | Seq Scan
60109(1 row)
61110
62- SELECT * FROM test_boxes WHERE b <@ sbox '( (10d,10d), (20d,20d) )';
63- b
64- ---
65- (0 rows)
111+ SELECT COUNT(*) FROM test_boxes WHERE b <@ sbox '( (10d,10d), (20d,20d) )';
112+ count
113+ -------
114+ 0
115+ (1 row)
66116
67117SELECT 'scan_idx', qnodes('SELECT * FROM test_boxes WHERE b && sbox ''( (10d,10d), (20d,20d) )''');
68118 ?column? | qnodes
69119----------+----------
70120 scan_idx | Seq Scan
71121(1 row)
72122
73- SELECT * FROM test_boxes WHERE b && sbox '( (10d,10d), (20d,20d) )';
74- b
75- ------------------------------------------------------------------------------------
76- ((0.349065850398866 , 0.174532925199433), (0.350065850398866 , 0.174632925199433))
123+ SELECT COUNT(*) FROM test_boxes WHERE b && sbox '( (10d,10d), (20d,20d) )';
124+ count
125+ -------
126+ 1000
77127(1 row)
78128
79129---- cleanup
80- DROP INDEX brin_sbox;
81- ERROR: index "brin_sbox" does not exist
130+ DROP INDEX test_boxes_idx;
82131DROP TABLE test_boxes;
83132DROP FUNCTION qnodes(text);
84- set enable_indexscan = on ;
85- set enable_bitmapscan = on ;
86- set enable_seqscan = on ;
133+ SET enable_indexscan = ON ;
134+ SET enable_bitmapscan = ON ;
135+ SET enable_seqscan = ON ;
0 commit comments