Re: pgsql: Add parallel-aware hash joins.
Thomas Munro <thomas.munro@enterprisedb.com>
Attachments
- fix-phj-explain-v2.patch (application/octet-stream) patch v2
On Sun, Dec 31, 2017 at 5:16 AM, Andres Freund <andres@anarazel.de> wrote: >> In a race case, EXPLAIN ANALYZE could fail to display correct nbatch and size >> information. Refactor so that participants report only on batches they worked >> on rather than trying to report on all of them, and teach explain.c to >> consider the HashInstrumentation object from all participants instead of >> picking the first one it can find. This should fix an occasional build farm >> failure in the "join" regression test. > > This seems buggy independent of whether it fixes the issue on prairedog, > right? So I'm inclined to go ahead and just fix it... +1 >> + /* >> + * Merge results from workers. In the parallel-oblivious case, the >> + * results from all participants should be identical, except where >> + * participants didn't run the join at all so have no data. In the >> + * parallel-aware case, we need to aggregate the results. Each worker may >> + * have seen a different subset of batches and we want to report the peak >> + * memory usage across all batches. >> + */ > > It's not necessarily the peak though, right? The largest batches might > not be read in at the same time. I'm fine with approximating it as such, > just want to make sure I understand. Yeah, it's not attempting to report the true simultaneous peak memory usage. It's only reporting the largest individual hash table ever loaded. In a multi-batch join more than one hash table may be loaded at the same time -- up to the number of participants -- but I'm not yet attempting to reflect that. On the one hand, that's a bit like the way we show the size for parallel-oblivious hash joins: each participant used the reported amount of memory at approximately the same time. On the other hand, the total simultaneous memory usage for parallel-aware hash join is capped by both nbatch and nparticipants: the true simultaneous peak must be <= largest_hash_table * Min(nbatch, nparticipants). I considered various ways to capture and report this (see the 0007 patch in the v26 patchset, which showed per-worker information separately, but I abandoned that patch because it was useless and confusing; another idea would be to report the sum of the nparticipants largest hash tables, or just assume all batches are similarly sized and use the formula I gave above, and another would be to actually track which hash tables or memory regions that were simultaneously loaded with an incremental shared counter maintained when hash chunks and bucket arrays are allocated and freed), but figured we should just go with something super simple for now and then discuss better ideas as a later evolution. >> [code] > > I bet pgindent will not like this layout. pgindented. > Ho hum. Is this really, as you say above, an "aggregate the results"? Yeah, misleading/stupid use of "aggregate" (SQL MAX() is an aggregate...). Offending word removed. -- Thomas Munro http://www.enterprisedb.com
Commits
-
Update obsolete sentence in README.parallel.
- 28e04155f17c 11.0 cited
-
Rewrite ConditionVariableBroadcast() to avoid live-lock.
- aced5a92bf46 11.0 cited
-
Tweak parallel hash join test case in hopes of improving stability.
- 934c7986f4a0 11.0 landed
-
Rename pg_rewind's copy_file_range() to avoid conflict with new linux syscall.
- 3e68686e2c55 11.0 cited
-
Fix some minor errors in new PHJ code.
- 6fcde2406304 11.0 landed
-
Fix EXPLAIN ANALYZE output for Parallel Hash.
- 93ea78b17c47 11.0 landed
-
Fix rare assertion failure in parallel hash join.
- f83040c62a78 11.0 landed
-
Cancel CV sleep during subtransaction abort.
- f3decdc94ea3 10.2 landed
- 59d1e2b95a82 11.0 landed
-
Add parallel-aware hash joins.
- 1804284042e6 11.0 cited
-
Fix EXPLAIN ANALYZE of hash join when the leader doesn't participate.
- 5bcf389ecfd4 11.0 cited
-
Add some regression tests that exercise hash join code.
- fa330f9adf4e 11.0 cited