On 12/5/14, 1:22 PM, Jim Nasby wrote:
On 12/5/14, 3:42 AM, Amit Langote wrote:
> I think you are right. I think in this case we need something similar
>to column pg_index.indexprs which is of type pg_node_tree(which
>seems to be already suggested by Robert). So may be we can proceed
>with this type and see if any one else has better idea.
One point raised about/against pg_node_tree was the values represented therein
would turn out to be too generalized to be used with advantage during planning.
But, it seems we could deserialize it in advance back to the internal form
(like an array of a struct) as part of the cached relation data. This overhead
would only be incurred in case of partitioned tables. Perhaps this is what
Robert suggested elsewhere.
In order to store a composite type in a catalog, we would need to have one field that has
the typid of the composite, and the field that stores the actual composite data would
need to be a "dumb" varlena that stores the composite HeapTupleHeader.
On further thought; if we disallow NULL as a partition boundary, we don't need
a separate rowtype; we could just use the one associated with the relation
itself. Presumably that would make comparing tuples to the relation list a lot
easier.
I was hung up on how that would work in the case of ALTER TABLE, but we'd have
the same problem with using pg_node_tree: if you alter a table in such a way
that *might* affect your partitioning, you have to do some kind of revalidation
anyway.
The other option would be to use some custom rowtype to store boundary values
and have a method that can form a boundary tuple from a real one. Either way, I
suspect this is better than frequently evaluating pg_node_trees.
There may be one other option. If range partitions are defined in terms of an
expression that is different for every partition (ie: (substr(product_key, 1,
4), date_trunc('month', sales_date))) then we could use a hash of that
expression to identify a partition. In other words, range partitioning becomes
a special case of hash partitioning. I do think we need a programmatic means to
identify the range of an individual partition and hash won't solve that, but
the performance of that case isn't critical so we could use pretty much
whatever we wanted to there.
--
Jim Nasby, Data Architect, Blue Treble Consulting
Data in Trouble? Get it in Treble! http://BlueTreble.com
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers