On Thu, Mar 11, 2021 at 01:01:42PM +0000, houzj.f...@fujitsu.com wrote: > > I guess to have the finer granularity we'd have to go with > > enable_parallel_insert, > > which then would mean possibly having to later add enable_parallel_update, > > should parallel update have similar potential overhead in the > > parallel-safety > > checks (which to me, looks like it could, and parallel delete may not ...) > > > > It's a shame there is no "set" type for GUC options. > > e.g. > > enable_parallel_dml='insert,update' > > Maybe that's going too far.
Isn't that just GUC_LIST_INPUT ? I'm not sure why it'd be going to far ? The GUC-setting assign hook can parse the enable_parallel_dml_list value set by the user, and set an internal int/bits enable_parallel_dml variable with some define/enum values like: GUC_PARALLEL_DML_INSERT 0x01 GUC_PARALLEL_DML_DELETE 0x02 GUC_PARALLEL_DML_UPDATE 0x04 The namespace.c assign hook is a good prototype for this. The parsed, integer GUC can probably be a static variable in clauses.c. Then, the planner can check if: |commandType == CMD_INSERT && | (enable_parallel_dml & GUC_PARALLEL_DML_INSERT) != 0 [...] + this table. When enabled (and provided that + <xref linkend="guc-enable-parallel-insert"/> is also <literal>true</literal>), It seems like this usefully allows the GUC to be enabled, and reloption to be disabled. But if the GUC is disabled, then it's impossible to enable for a single table. That seems unfortunate. I think part of the issue is the naming. If the GUC is called "enable_*", then setting it to "off" should disable it entirely, for consistency with other GUCs. So maybe it needs another name, like parallel_dml='insert'. I think maybe "all" should be an accepted value. Note also this CF entry https://commitfest.postgresql.org/32/2987/ | Allow setting parallel_workers on partitioned tables -- Justin