blob: 29c7813575bdbbd82b2bf7decd250aa555f47145 [file] [log] [blame]
SET optimizer TO OFF;
-- Test Suit: IndexScan on AO tables
SHOW gp_enable_ao_indexscan;
gp_enable_ao_indexscan
------------------------
off
(1 row)
CREATE TABLE ao_tbl(a int, b int, c int) WITH (appendonly='true', orientation='row');
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE aocs_tbl(a int, b int, c int) WITH (appendonly='true', orientation='column');
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
-- Generate small data set
INSERT INTO ao_tbl
SELECT i, (((i%10007)*(i%997))+11451)%100000, 1
FROM generate_series(1, 100000) s(i);
INSERT INTO aocs_tbl SELECT * FROM ao_tbl;
CREATE INDEX ON ao_tbl(b);
CREATE INDEX ON aocs_tbl(b);
ANALYZE ao_tbl, aocs_tbl;
-- Test with optimization off
SET gp_enable_ao_indexscan TO OFF;
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 1;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on ao_tbl
Optimizer: Postgres query optimizer
(8 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 1000;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on ao_tbl
Optimizer: Postgres query optimizer
(8 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 1;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on aocs_tbl
Optimizer: Postgres query optimizer
(8 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 1000;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on aocs_tbl
Optimizer: Postgres query optimizer
(8 rows)
-- Test with optimization on
SET gp_enable_ao_indexscan TO ON;
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 1;
QUERY PLAN
-----------------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Index Scan using ao_tbl_b_idx on ao_tbl
Optimizer: Postgres query optimizer
(6 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 10;
QUERY PLAN
-----------------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Index Scan using ao_tbl_b_idx on ao_tbl
Optimizer: Postgres query optimizer
(6 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 100;
QUERY PLAN
-----------------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Index Scan using ao_tbl_b_idx on ao_tbl
Optimizer: Postgres query optimizer
(6 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 1000;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on ao_tbl
Optimizer: Postgres query optimizer
(8 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 1;
QUERY PLAN
---------------------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Index Scan using aocs_tbl_b_idx on aocs_tbl
Optimizer: Postgres query optimizer
(6 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 10;
QUERY PLAN
---------------------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Index Scan using aocs_tbl_b_idx on aocs_tbl
Optimizer: Postgres query optimizer
(6 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 100;
QUERY PLAN
---------------------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Index Scan using aocs_tbl_b_idx on aocs_tbl
Optimizer: Postgres query optimizer
(6 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 1000;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on aocs_tbl
Optimizer: Postgres query optimizer
(8 rows)
-- Test with subquery
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.c FROM ao_tbl t1,
(SELECT * FROM ao_tbl ORDER BY b LIMIT 10) t2
WHERE t1.a = t2.a;
QUERY PLAN
-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Hash Join
Hash Cond: (t1.a = t2.a)
-> Seq Scan on ao_tbl t1
-> Hash
-> Redistribute Motion 1:3 (slice2; segments: 1)
Hash Key: t2.a
-> Subquery Scan on t2
-> Limit
-> Gather Motion 3:1 (slice3; segments: 3)
Merge Key: ao_tbl.b
-> Limit
-> Index Scan using ao_tbl_b_idx on ao_tbl
Optimizer: Postgres query optimizer
(14 rows)
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.c FROM aocs_tbl t1,
(SELECT * FROM aocs_tbl ORDER BY b LIMIT 10) t2
WHERE t1.a = t2.a;
QUERY PLAN
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Hash Join
Hash Cond: (t1.a = t2.a)
-> Seq Scan on aocs_tbl t1
-> Hash
-> Redistribute Motion 1:3 (slice2; segments: 1)
Hash Key: t2.a
-> Subquery Scan on t2
-> Limit
-> Gather Motion 3:1 (slice3; segments: 3)
Merge Key: aocs_tbl.b
-> Limit
-> Index Scan using aocs_tbl_b_idx on aocs_tbl
Optimizer: Postgres query optimizer
(14 rows)
-- Ensure that IndexOnlyScan is disabled
SET enable_seqscan TO OFF;
SET enable_indexscan TO OFF;
SET enable_bitmapscan TO OFF;
EXPLAIN (COSTS OFF)
SELECT * FROM ao_tbl ORDER BY b LIMIT 1;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on ao_tbl
Optimizer: Postgres query optimizer
(8 rows)
EXPLAIN (COSTS OFF)
SELECT * FROM aocs_tbl ORDER BY b LIMIT 1;
QUERY PLAN
------------------------------------------------
Limit
-> Gather Motion 3:1 (slice1; segments: 3)
Merge Key: b
-> Limit
-> Sort
Sort Key: b
-> Seq Scan on aocs_tbl
Optimizer: Postgres query optimizer
(8 rows)
-- Cleanup
DROP TABLE ao_tbl, aocs_tbl;
SET gp_enable_ao_indexscan TO OFF;
SET enable_seqscan TO ON;
SET enable_indexscan TO ON;
SET enable_bitmapscan TO ON;
-- Final step
SET optimizer TO default;