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

From: Sbob <sbob(at)quadratum-braccas(dot)com>
To: Keith Fiske <keith(dot)fiske(at)crunchydata(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 20:48:36
Message-ID: f1b40028-4bcb-4059-9f7b-975da3c3c4e8@quadratum-braccas.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin


On 10/24/24 11:16 AM, Keith Fiske wrote:
>
>
> 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');
>

same results

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

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Muhammad Usman Khan 2024-10-25 04:31:06 Re: Will there be data loss between slot syncronisation
Previous Message Paul Smith* 2024-10-24 17:28:55 Re: Partitioned table scanning all pertitions when the where clause specifies the partition key