Commit 6569711
committed
Enable Parallel Hash Left Anti Semi (Not-In) Join(parallel-oblivious).
This is a parallel-oblivious parallel hash join, that each inner side
table would be duplicately processed without a shared hash table.
We could benefit from parallel if the outer table is large and inner
table is relatively small.
See [1] below for example DDL and DML.
Non-parallel plan:
explain(analyze, costs off) select sum(t1.c1) from t1 where c1 not in (select c1 from t2);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual time=1808.872..1808.875 rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual time=1745.235..1808.858 rows=3 loops=1)
-> Partial Aggregate (actual time=1808.622..1808.625 rows=1 loops=1)
-> Hash Left Anti Semi (Not-In) Join (actual time=2.890..1583.005 rows=1667434 loops=1)
Hash Cond: (t1.c1 = t2.c1)
Extra Text: (seg2) Hash chain length 1.0 avg, 2 max, using 1199 of 524288 buckets.
-> Seq Scan on t1 (actual time=0.355..678.531 rows=1667832 loops=1)
-> Hash (actual time=2.068..2.069 rows=1200 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4139kB
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual time=1.476..1.772 rows=1200 loops=1)
-> Seq Scan on t2 (actual time=0.356..0.499 rows=407 loops=1)
Planning Time: 0.454 ms
(slice0) Executor memory: 124K bytes.
(slice1) Executor memory: 4443K bytes avg x 3x(0) workers, 4443K bytes max (seg0). Work_mem: 4139K bytes max.
(slice2) Executor memory: 262K bytes avg x 3x(0) workers, 262K bytes max (seg0).
Memory used: 128000kB
Optimizer: Postgres query optimizer
Execution Time: 1809.517 ms
(18 rows)
Time: 1810.827 ms (00:01.811)
Parallel plan:
explain(analyze, costs off) select sum(t1.c1) from t1 where c1 not in (select c1 from t2);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual time=758.707..758.710 rows=1 loops=1)
-> Gather Motion 6:1 (slice1; segments: 6) (actual time=668.747..758.685 rows=6 loops=1)
-> Partial Aggregate (actual time=752.479..752.483 rows=1 loops=1)
-> Hash Left Anti Semi (Not-In) Join (actual time=3.010..565.127 rows=833732 loops=1)
Hash Cond: (t1.c1 = t2.c1)
Extra Text: (seg2) Hash chain length 1.0 avg, 2 max, using 1199 of 524288 buckets.
-> Parallel Seq Scan on t1 (actual time=0.368..231.049 rows=833932 loops=1)
-> Hash (actual time=2.148..2.149 rows=1200 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4139kB
-> Broadcast Motion 3:6 (slice2; segments: 3) (actual time=0.203..1.779 rows=1200 loops=1)
-> Seq Scan on t2 (actual time=0.361..0.499 rows=407 loops=1)
Planning Time: 0.470 ms
(slice0) Executor memory: 124K bytes.
(slice1) Executor memory: 4483K bytes avg x 6x(0) workers, 4483K bytes max (seg0). Work_mem: 4139K bytes max.
(slice2) Executor memory: 262K bytes avg x 3x(0) workers, 262K bytes max (seg0).
Memory used: 128000kB
Optimizer: Postgres query optimizer
Execution Time: 759.440 ms
(18 rows)
Time: 760.874 ms
[1] Example:
create table t1(c1 int, c2 int) using ao_row distributed by (c1);
create table t2(c1 int, c2 int) using ao_row distributed by (c1);
set enable_parallel = on;
set gp_appendonly_insert_files = 2;
set gp_appendonly_insert_files_tuples_range = 100;
set max_parallel_workers_per_gather = 2;
insert into t1 select i, i from generate_series(1, 5000000) i;
insert into t2 select i+1, i from generate_series(1, 1200) i;
analyze t1;
analyze t2;
Authored-by: Zhang Mingli avamingli@gmail.com1 parent fc90fec commit 6569711
3 files changed
Lines changed: 109 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2299 | 2299 | | |
2300 | 2300 | | |
2301 | 2301 | | |
2302 | | - | |
2303 | 2302 | | |
2304 | 2303 | | |
2305 | 2304 | | |
| |||
2319 | 2318 | | |
2320 | 2319 | | |
2321 | 2320 | | |
| 2321 | + | |
2322 | 2322 | | |
2323 | 2323 | | |
2324 | 2324 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1513 | 1513 | | |
1514 | 1514 | | |
1515 | 1515 | | |
| 1516 | + | |
| 1517 | + | |
| 1518 | + | |
| 1519 | + | |
| 1520 | + | |
| 1521 | + | |
| 1522 | + | |
| 1523 | + | |
| 1524 | + | |
| 1525 | + | |
| 1526 | + | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
| 1534 | + | |
| 1535 | + | |
| 1536 | + | |
| 1537 | + | |
| 1538 | + | |
| 1539 | + | |
| 1540 | + | |
| 1541 | + | |
| 1542 | + | |
| 1543 | + | |
| 1544 | + | |
| 1545 | + | |
| 1546 | + | |
| 1547 | + | |
| 1548 | + | |
| 1549 | + | |
| 1550 | + | |
| 1551 | + | |
| 1552 | + | |
| 1553 | + | |
| 1554 | + | |
| 1555 | + | |
| 1556 | + | |
| 1557 | + | |
| 1558 | + | |
| 1559 | + | |
| 1560 | + | |
| 1561 | + | |
| 1562 | + | |
| 1563 | + | |
| 1564 | + | |
| 1565 | + | |
| 1566 | + | |
| 1567 | + | |
| 1568 | + | |
| 1569 | + | |
| 1570 | + | |
| 1571 | + | |
| 1572 | + | |
| 1573 | + | |
| 1574 | + | |
| 1575 | + | |
| 1576 | + | |
| 1577 | + | |
| 1578 | + | |
| 1579 | + | |
| 1580 | + | |
| 1581 | + | |
| 1582 | + | |
| 1583 | + | |
| 1584 | + | |
| 1585 | + | |
| 1586 | + | |
| 1587 | + | |
| 1588 | + | |
| 1589 | + | |
| 1590 | + | |
1516 | 1591 | | |
1517 | 1592 | | |
1518 | 1593 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
441 | 441 | | |
442 | 442 | | |
443 | 443 | | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
444 | 477 | | |
445 | 478 | | |
446 | 479 | | |
| |||
0 commit comments