Re: [HACKERS] Parallel Hash take II - Mailing list pgsql-hackers
| From | Andres Freund |
|---|---|
| Subject | Re: [HACKERS] Parallel Hash take II |
| Date | |
| Msg-id | 20171108191240.72q5gtrjqa7jge4w@alap3.anarazel.de Whole thread Raw |
| In response to | Re: [HACKERS] Parallel Hash take II (Thomas Munro <thomas.munro@enterprisedb.com>) |
| Responses |
Re: [HACKERS] Parallel Hash take II
|
| List | pgsql-hackers |
Hi,
@@ -747,7 +747,7 @@ try_hashjoin_path(PlannerInfo *root, * never have any output pathkeys, per comments in
create_hashjoin_path. */ initial_cost_hashjoin(root, &workspace, jointype, hashclauses,
- outer_path, inner_path, extra);
+ outer_path, inner_path, extra, false); if (add_path_precheck(joinrel,
workspace.startup_cost, workspace.total_cost,
@@ -761,6 +761,7 @@ try_hashjoin_path(PlannerInfo *root, extra,
outer_path, inner_path,
+ false, /* parallel_hash */
extra->restrictlist, required_outer,
hashclauses));
@@ -776,6 +777,10 @@ try_hashjoin_path(PlannerInfo *root, * try_partial_hashjoin_path * Consider a partial
hashjoinjoin path; if it appears useful, push it into * the joinrel's partial_pathlist via add_partial_path().
+ * The outer side is partial. If parallel_hash is true, then the inner path
+ * must be partial and will be run in parallel to create one or more shared
+ * hash tables; otherwise the inner path must be complete and a copy of it
+ * is run in every process to create separate identical private hash tables. */
When do we have "or more shared hash tables" rather than one? Are you
thinking about subordinate nodes?
@@ -1839,6 +1846,10 @@ hash_inner_and_outer(PlannerInfo *root, * able to properly guarantee uniqueness.
Similarly,we can't handle * JOIN_FULL and JOIN_RIGHT, because they can produce false null * extended
rows. Also, the resulting path must not be parameterized.
+ * We should be able to support JOIN_FULL and JOIN_RIGHT for Parallel
+ * Hash, since in that case we're back to a single hash table with a
+ * single set of match bits for each batch, but that will require
+ * figuring out a deadlock-free way to wait for the probe to finish. */
s/should be able/would be able/?
index 6a45b68e5df..2d38a5efae8 100644
--- a/src/backend/storage/ipc/barrier.c
+++ b/src/backend/storage/ipc/barrier.c
@@ -451,7 +451,6 @@ BarrierDetachImpl(Barrier *barrier, bool arrive) release = true; barrier->arrived =
0; ++barrier->phase;
- Assert(barrier->selected); barrier->selected = false; }
Uh, what?
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out
index 35523bd8065..40a076d976f 100644
--- a/src/test/regress/expected/join.out
+++ b/src/test/regress/expected/join.out
@@ -5821,6 +5821,9 @@ analyze extremely_skewed;insert into extremely_skewed select 42 as id,
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' from generate_series(1, 19000);
+-- Make a relation with a couple of enormous tuples.
+create table wide as select generate_series(1, 2) as id, rpad('', 320000, 'x') as t;
+alter table wide set (parallel_workers = 2);
I'm doubtful this is actually going to be a wide tuple - this'll get
compressed down quite a bit, no?
postgres[26465][1]=# SELECT octet_length(t), pg_column_size(t) FROM wide ;
┌──────────────┬────────────────┐
│ octet_length │ pg_column_size │
├──────────────┼────────────────┤
│ 320000 │ 3671 │
│ 320000 │ 3671 │
└──────────────┴────────────────┘
(2 rows)
(and yes, it's ridiculous that a compressed datum of that size still
takes up 3kb)
+-- parallel with parallel-aware hash join
+set max_parallel_workers_per_gather = 2;
+set work_mem = '128kB';
+set enable_parallel_hash = on;
I think it'd be better if we structured the file so we just sat guc's
with SET LOCAL inside a transaction.
+-- parallel with parallel-aware hash join
+set max_parallel_workers_per_gather = 2;
+set work_mem = '64kB';
+set enable_parallel_hash = on;
+explain (costs off)
+ select count(*) from simple r join extremely_skewed s using (id);
+ QUERY PLAN
+-----------------------------------------------------------------------
+ Finalize Aggregate
+ -> Gather
+ Workers Planned: 2
+ -> Partial Aggregate
+ -> Parallel Hash Join
+ Hash Cond: (r.id = s.id)
+ -> Parallel Seq Scan on simple r
+ -> Parallel Hash
+ -> Parallel Seq Scan on extremely_skewed s
+(9 rows)
+
+select count(*) from simple r join extremely_skewed s using (id);
+ count
+-------
+ 20000
+(1 row)
As written before, I think it'd be good if we extracted the number of
batches from json output to be sure things are going sensibly.
All-in-all this part looks fairly boring.
- Andres
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
pgsql-hackers by date: