Re: [HACKERS] path toward faster partition pruning
Amit Langote <langote_amit_f8@lab.ntt.co.jp>
On 2018/03/02 21:43, Robert Haas wrote: > On Fri, Mar 2, 2018 at 1:22 AM, Amit Langote > <Langote_Amit_f8@lab.ntt.co.jp> wrote: >> But I realized we don't need the coercion. Earlier steps would have >> determined that the clause from which the expression originated contains >> an operator that is compatible with the partitioning operator family. If >> so, the type of the expression in question, even though different from the >> partition key type, would be binary coercible with it. > > That doesn't follow. Knowing that two types are in the same operator > family doesn't guarantee that the types are binary coercible. For > example, int8 is not binary-coercible to int2. Moreover, you'd better > be pretty careful about trying to cast int8 to int2 because it might > turn a query that would have returned no rows into one that fails > outright; that's not OK. Imagine that the user types: > > SELECT * FROM partitioned_by_int2 WHERE a = 1000000000000; > > I think what needs to happen with cross-type situations is that you > look in the opfamily for a comparator that takes the types you want as > input; if you can't find one, you have to give up on pruning. If you > do find one, then you use it. For example in the above query, once > you find btint28cmp, you can use that to compare the user-provided > constant against the range bounds for the various partitions to see > which one might contain it. You'll end up selecting the partition > with upper bound MAXVALUE if there is one, or no partition at all if > every partition has a finite upper bound. That's as well as we can do > with current infrastructure, I think. Hmm, yes. So while the patch's previous approach to convert the query's constant value to the desired type was wrong, this is wronger. :-( I guess I'll need to change the patch such that the comparison function used for comparing partition bounds with a query-specified constant will change from the default one from the PartitionKey to the one that accepts the latter. Thanks, Amit
Commits
-
Fix assorted partition pruning bugs
- d758d9702e2f 11.0 landed
-
Make gen_partprune_steps static
- d1e2cac5ff7e 11.0 landed
-
Remove useless 'default' clause
- c775fb9e18ac 11.0 landed
-
Reorganize partitioning code
- da6f3e45ddb6 11.0 landed
-
Use custom hash opclass for hash partition pruning
- fafec4cce814 11.0 landed
-
Blindly attempt to fix sepgsql tests broken due to 9fdb675fc5.
- 4f813c7203e0 11.0 landed
-
Attempt to fix endianess issues in new hash partition test.
- 40e42e1024c5 11.0 landed
-
Faster partition pruning
- 9fdb675fc5d2 11.0 landed
-
For partitionwise join, match on partcollation, not parttypcoll.
- 2af28e603319 11.0 landed
-
Revise API for partition bound search functions.
- f724022d0ae0 11.0 landed
-
Revise API for partition_rbound_cmp/partition_rbound_datum_cmp.
- b0229235564f 11.0 landed
-
Fix possible crash in partition-wise join.
- f069c91a5793 11.0 cited
-
Refactor code for partition bound searching
- 9aef173163ae 11.0 landed
-
New C function: bms_add_range
- 84940644de93 11.0 landed
-
Add extensive tests for partition pruning.
- 8d4e70a63bf8 11.0 landed
-
Add null test to partition constraint for default range partitions.
- 7b88d63a9122 11.0 cited
-
Remove BufFile's isTemp flag.
- 11e264517dff 11.0 cited
-
Make OWNER TO subcommand mention consistent
- bf54c0f05c0a 11.0 cited
-
Fix index matching for operators with mixed collatable/noncollatable inputs.
- cb37c291060d 9.2.0 cited