|
| 1 | +SET optimizer TO on; |
| 2 | + |
| 3 | +-- Test Suit 1: runtime filter main case |
| 4 | +DROP TABLE IF EXISTS fact_rf, dim_rf; |
| 5 | +CREATE TABLE fact_rf (fid int, did int, val int) using pax WITH(minmax_columns='fid,did,val'); |
| 6 | +CREATE TABLE dim_rf (did int, proj_id int, filter_val int) using pax WITH(minmax_columns='did,proj_id,filter_val'); |
| 7 | + |
| 8 | +-- Generating data, fact_rd.did and dim_rf.did is 80% matched |
| 9 | +INSERT INTO fact_rf SELECT i, i % 8000 + 1, i FROM generate_series(1, 100000) s(i); |
| 10 | +INSERT INTO dim_rf SELECT i, i % 10, i FROM generate_series(1, 10000) s(i); |
| 11 | +ANALYZE fact_rf, dim_rf; |
| 12 | + |
| 13 | +SET gp_enable_runtime_filter_pushdown TO off; |
| 14 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM fact_rf, dim_rf |
| 15 | + WHERE fact_rf.did = dim_rf.did AND proj_id < 2 AND filter_val <= 1000; |
| 16 | + |
| 17 | +SET gp_enable_runtime_filter_pushdown TO on; |
| 18 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM fact_rf, dim_rf |
| 19 | + WHERE fact_rf.did = dim_rf.did AND proj_id < 2 AND filter_val <= 1000; |
| 20 | + |
| 21 | +-- Test bad filter rate |
| 22 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM fact_rf, dim_rf |
| 23 | + WHERE fact_rf.did = dim_rf.did AND proj_id < 7; |
| 24 | + |
| 25 | +-- Test outer join |
| 26 | +-- LeftJoin (eliminated and applicatable) |
| 27 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM |
| 28 | + fact_rf LEFT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 29 | + WHERE proj_id < 2 AND filter_val <= 1000; |
| 30 | + |
| 31 | +-- LeftJoin |
| 32 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM |
| 33 | + fact_rf LEFT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 34 | + WHERE proj_id IS NULL OR proj_id < 2 AND filter_val <= 1000; |
| 35 | + |
| 36 | +-- RightJoin (applicatable) |
| 37 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM |
| 38 | + fact_rf RIGHT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 39 | + WHERE proj_id < 2 AND filter_val <= 1000; |
| 40 | + |
| 41 | +-- SemiJoin |
| 42 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM fact_rf |
| 43 | + WHERE fact_rf.did IN (SELECT did FROM dim_rf WHERE proj_id < 2 AND filter_val <= 1000); |
| 44 | + |
| 45 | +-- SemiJoin -> InnerJoin and deduplicate |
| 46 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM dim_rf |
| 47 | + WHERE dim_rf.did IN (SELECT did FROM fact_rf) AND proj_id < 2 AND filter_val <= 1000; |
| 48 | + |
| 49 | +-- Test correctness |
| 50 | +SELECT * FROM fact_rf, dim_rf |
| 51 | + WHERE fact_rf.did = dim_rf.did AND dim_rf.filter_val = 1 |
| 52 | + ORDER BY fid; |
| 53 | + |
| 54 | +SELECT * FROM |
| 55 | + fact_rf LEFT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 56 | + WHERE dim_rf.filter_val = 1 |
| 57 | + ORDER BY fid; |
| 58 | + |
| 59 | +SELECT COUNT(*) FROM |
| 60 | + fact_rf LEFT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 61 | + WHERE proj_id < 2 AND filter_val <= 1000; |
| 62 | + |
| 63 | +SELECT COUNT(*) FROM |
| 64 | + fact_rf LEFT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 65 | + WHERE proj_id IS NULL OR proj_id < 2 AND filter_val <= 1000; |
| 66 | + |
| 67 | +SELECT COUNT(*) FROM |
| 68 | + fact_rf RIGHT JOIN dim_rf ON fact_rf.did = dim_rf.did |
| 69 | + WHERE proj_id < 2 AND filter_val <= 1000; |
| 70 | + |
| 71 | +SELECT COUNT(*) FROM fact_rf |
| 72 | + WHERE fact_rf.did IN (SELECT did FROM dim_rf WHERE proj_id < 2 AND filter_val <= 1000); |
| 73 | + |
| 74 | +SELECT COUNT(*) FROM dim_rf |
| 75 | + WHERE dim_rf.did IN (SELECT did FROM fact_rf) AND proj_id < 2 AND filter_val <= 1000; |
| 76 | + |
| 77 | +-- Test contain null values |
| 78 | +INSERT INTO dim_rf VALUES (NULL,1, 1); |
| 79 | +EXPLAIN ANALYZE SELECT COUNT(*) FROM fact_rf, dim_rf |
| 80 | + WHERE fact_rf.did = dim_rf.did AND proj_id < 2 AND filter_val <= 1000; |
| 81 | +SELECT COUNT(*) FROM fact_rf, dim_rf |
| 82 | + WHERE fact_rf.did = dim_rf.did AND proj_id < 2 AND filter_val <= 1000; |
| 83 | + |
| 84 | +-- Clean up: reset guc |
| 85 | +SET gp_enable_runtime_filter_pushdown TO off; |
| 86 | +RESET optimizer; |
0 commit comments