Re: Parallel bitmap index scan

Поиск
Список
Период
Сортировка
От Dilip Kumar
Тема Re: Parallel bitmap index scan
Дата
Msg-id CAFiTN-s093P+2R5jqYjkHAyEbTnj-fcdDf2+csVBY0FR5kESMA@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Parallel bitmap index scan  (Thomas Munro <thomas.munro@gmail.com>)
Список pgsql-hackers


On Mon, 27 Jul 2020 at 3:48 AM, Thomas Munro <thomas.munro@gmail.com> wrote:
On Mon, Jul 27, 2020 at 1:58 AM Dilip Kumar <dilipbalaut@gmail.com> wrote:
> On Sun, Jul 26, 2020 at 6:42 PM Dilip Kumar <dilipbalaut@gmail.com> wrote:
> >
> > I would like to propose a patch for enabling the parallelism for the
> > bitmap index scan path.

                Workers Planned: 4
                ->  Parallel Bitmap Heap Scan on tenk1
                      Recheck Cond: (hundred > 1)
-                     ->  Bitmap Index Scan on tenk1_hundred
+                     ->  Parallel Bitmap Index Scan on tenk1_hundred
                            Index Cond: (hundred > 1)

+1, this is a very good feature to have.

+                                       /* Merge bitmap to a common
shared bitmap */
+                                       SpinLockAcquire(&pstate->mutex);
+                                       tbm_merge(tbm,
&pstate->tbm_shared, &pstate->pt_shared);
+                                       SpinLockRelease(&pstate->mutex);

This doesn't look like a job for a spinlock.

Yes I agree with that.

You have a barrier so that you can wait until all workers have
finished merging their partial bitmap into the complete bitmap, which
makes perfect sense.  You also use that spinlock (probably should be
LWLock) to serialise the bitmap merging work...  Hmm, I suppose there
would be an alternative design which also uses the barrier to
serialise the merge, and has the merging done entirely by one process,
like this:

  bool chosen_to_merge = false;

  /* Attach to the barrier, and see what phase we're up to. */
  switch (BarrierAttach())
  {
  case PBH_BUILDING:
    ... build my partial bitmap in shmem ...
    chosen_to_merge = BarrierArriveAndWait();
    /* Fall through */

  case PBH_MERGING:
    if (chosen_to_merge)
      ... perform merge of all partial results into final shmem bitmap ...
    BarrierArriveAndWait();
    /* Fall through */

  case PBH_SCANNING:
    /* We attached too late to help build the bitmap.  */
    BarrierDetach();
    break;
  }

Just an idea, not sure if it's a good one.  I find it a little easier
to reason about the behaviour of late-attaching workers when the
phases are explicitly named and handled with code like that (it's not
immediately clear to me whether your coding handles late attachers
correctly, which seems to be one of the main problems to think about
with "dynamic party" parallelism...).

Yeah this seems better idea.  I am handling late attachers case but the idea of using the barrier phase looks quite clean.  I will change it this way.
--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Jeff Davis
Дата:
Сообщение: Re: hashagg slowdown due to spill changes
Следующее
От: Michael Paquier
Дата:
Сообщение: Re: handle a ECPG_bytea typo