Re: Partial index creation always scans the entire table

From: Justin Pryzby <pryzby(at)telsasoft(dot)com>
To: MingJu Wu <mingjuwu0505(at)gmail(dot)com>
Cc: pgsql-performance(at)lists(dot)postgresql(dot)org
Subject: Re: Partial index creation always scans the entire table
Date: 2020-02-15 12:53:30
Message-ID: 20200215125330.GE31889@telsasoft.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

On Sat, Feb 15, 2020 at 07:04:48PM +0800, MingJu Wu wrote:
> Hello,
>
> When creating partial indexes, can postgres utilize another index for
> figuring which rows should be included in the partial index, without
> performing a full table scan?
>
> My scenario is that I have a table with 50M rows that are categorized into
> 10K categories. I need to create a partial index for each category. I have
> created a index on the category column, hoping that postgres can use this
> information when creating the partial indexes. However, postgres always
> performs full table scan.
>
> I've tested with PostgreSQL 12.2. Below is an example setup showing the

I don't think it's possible, and an index scan wouldn't necessarily be faster,
anyway, since the reads might be unordered rather than sequantial, and might
hit large fractions of the table even though only returning a fraction of its
tuples.

But have you thought about partitioning on category rather than partial
indexes? Possibly hash partition of (category). If your queries usually
include category_id=X, that might be a win for performance anyway, since tables
can now be read sequentially rather than scannned by index (again, probably out
of order).

--
Justin

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Laurenz Albe 2020-02-15 21:15:53 Re: Partial index creation always scans the entire table
Previous Message Sergei Kornilov 2020-02-15 12:47:51 Re: Partial index creation always scans the entire table