From: | Amit Langote <amitlangote09(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
Cc: | David Rowley <david(dot)rowley(at)2ndquadrant(dot)com>, Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp>, Jesper Pedersen <jesper(dot)pedersen(at)redhat(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com>, Rajkumar Raghuwanshi <rajkumar(dot)raghuwanshi(at)enterprisedb(dot)com>, Kyotaro HORIGUCHI <horiguchi(dot)kyotaro(at)lab(dot)ntt(dot)co(dot)jp>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Beena Emerson <memissemerson(at)gmail(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: [HACKERS] path toward faster partition pruning |
Date: | 2018-04-06 15:36:28 |
Message-ID: | CA+HiwqEeyTkQya6Y1FvdTMJvPtDwNw6uZOsjNMhw=-MnSVAq_w@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Fri, Apr 6, 2018 at 11:54 PM, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> wrote:
> Alvaro Herrera wrote:
>
>> Yeah. Looking at this function, I noticed it tests for BooleanTest, and
>> falls back to checking "not_clause" and a few equals. Does it make
>> sense if the clause is a SAOP? I added this assert:
>> Assert(IsA(clause, BooleanTest) ||
>> IsA(clause, BoolExpr) ||
>> IsA(clause, RelabelType));
>>
>> and it failed:
>> #3 0x0000556cf04505db in match_boolean_partition_clause (partopfamily=424,
>> clause=0x556cf1041670, partkey=0x556cf1042218, rightop=0x7ffe520ec068)
>> at /pgsql/source/master/src/backend/optimizer/util/partprune.c:2159
>> 2159 Assert(IsA(clause, BooleanTest) ||
>> (gdb) print *clause
>> $1 = {type = T_ScalarArrayOpExpr}
>>
>> I'm not sure whether or not this function can trust that what's incoming
>> must absolutely be only those node types.
>
> So this is what I need for current regression tests not to crash
> anymore:
>
> Assert(IsA(clause, BooleanTest) ||
> IsA(clause, BoolExpr) ||
> IsA(clause, RelabelType) ||
> IsA(clause, ScalarArrayOpExpr) ||
> IsA(clause, OpExpr) ||
> IsA(clause, Var));
>
> I'm not confident in my ability to write code to handle all possible
> cases right now (obviously there must be more cases that are not covered
> by current regression tests), so I'll leave it without the assert since
> it handles a couple of the useful cases, but I suspect it could stand
> some more improvement.
>
> I guess the question is, how interesting is boolean partitioning? I bet
> it has its uses.
match_boolean_partition_clauses() exists to capture some cases where
an OpExpr (any expression that returns a Boolean for that matter)
itself is the partition key:
create table boolpart (a int) partition by list ((a = 1));
create table boolpart_t partition of boolpart for values in ('true');
create table boolpart_f partition of boolpart for values in ('false');
explain select * from boolpart where a = 1;
QUERY PLAN
------------------------------------------------------------------
Append (cost=0.00..41.88 rows=13 width=4)
-> Seq Scan on boolpart_t (cost=0.00..41.88 rows=13 width=4)
Filter: (a = 1)
(3 rows)
explain select * from boolpart where a = 2;
QUERY PLAN
------------------------------------------------------------------
Append (cost=0.00..41.88 rows=13 width=4)
-> Seq Scan on boolpart_f (cost=0.00..41.88 rows=13 width=4)
Filter: (a = 2)
(3 rows)
So, it's not that we're only in position to accept certain node types
in match_boolean_partition_clauses(). Before it existed, the pruning
didn't work because it wasn't matched to the partition key in the
special way that match_boolean_partition_clauses() does and end up in
the block in match_clause_to_partition_key() where the OpExpr's are
analyzed for normal (non-Boolean) situations, where we extract either
the leftop or rightop and try to match it with the partition key.
It might as well be:
create table boolpart (a int) partition by list ((a in (1, 2)));
Requiring us to be position to match an ScalarArrayOpExpr with the
partition key.
This resembles match_boolean_index_clause(), by the way.
Thanks,
Amit
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Langote | 2018-04-06 15:41:06 | Re: [HACKERS] path toward faster partition pruning |
Previous Message | Alvaro Herrera | 2018-04-06 14:54:39 | Re: [HACKERS] path toward faster partition pruning |