Re: Partitioned table scanning all pertitions when the where clause specifies the partition key

From: Keith Fiske <keith(dot)fiske(at)crunchydata(dot)com>
To: Sbob <sbob(at)quadratum-braccas(dot)com>
Cc: "pgsql-performance(at)lists(dot)postgresql(dot)org" <pgsql-admin(at)lists(dot)postgresql(dot)org>
Subject: Re: Partitioned table scanning all pertitions when the where clause specifies the partition key
Date: 2024-10-24 17:16:39
Message-ID: CAODZiv4jfNWNwQR8hwsVRrwD95i_cGDvAt9=BmzzaB2u2thygA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin

On Thu, Oct 24, 2024 at 12:53 PM Sbob <sbob(at)quadratum-braccas(dot)com> wrote:

> All;
>
>
> I created a table that includes a lastname column that is a varchar(50) :
>
>
> CREATE TABLE customers (
> cust_id bigint,
> custinfo text,
> cust_dob date,
> lastname varchar(50),
> firstname varchar(50),
> custaddr varchar(200),
> city varchar(100),
> state varchar(100),
> zipcode varchar(5)
> ) PARTITION BY LIST (lastname) ;
>
>
> Then we created 4,000 partitions with each partition hosting a specific
> set of lastname's (each partition has 100 lastname's)
>
> The partitions are all based on UPPER(lastname) like this:
>
>
> CREATE TABLE cust_part1
> PARTITION OF customer
> FOR VALUES IN ('SMITH', 'JONES','REX', 'ROBINSON', 'ROBINSON JR' ... )
>
>
> and all the partitions have been loaded up with all the data that lines
> up with the partition key (100 lastnames per partition)
>
>
> Each partition has an INDEX on upper(lastname)
>
>
>
> When I run something like :
>
> EXPLAIN SELECT * FROM customers where lastname = 'BORRIS';
>
>
> The explain plan does an index scan on each partition even though
> constraint_exclusion os set to "partition"
>
>
> Thanks in advance for any advice
>
>
>
>
>
>
Since your index is functional, in order to use the index, the queries must
use that same function in the condition. Try doing

EXPLAIN SELECT * FROM customers where lastname = upper('BORRIS');

or this should give the same result

EXPLAIN SELECT * FROM customers where lastname = upper('borris');

--
Keith Fiske
Senior Database Engineer
Crunchy Data - http://crunchydata.com

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Paul Smith* 2024-10-24 17:28:55 Re: Partitioned table scanning all pertitions when the where clause specifies the partition key
Previous Message Claus Koch 2024-10-24 17:13:33 Re: Postgres capacity planning.