Hello Robert and Robert,
CREATE TABLE foo(...) PARTITION BY HASH AUTOMATIC (MODULUS 10);
-- or some other syntax
This would be a relief on the longer path of dynamically creating
partitions, but with lower costs than a dynamic approach.
Yeah, I think something like this would be reasonable, but I think
that the best syntax is not really clear. We might want to look at
how other systems handle this.
I don't much like AUTOMATIC. It doesn't read like SQL's usual
pseudo-English.
My English is kind-of broken. The intention is to differentiate the 3
cases with some syntax to say very clearly whether:
- no partitions are created immediately (current case)
but will have to be created manually later
- static partitions are created automatically, based on provided
parameters
- dynamic partitions will be created later, when needed, based
on provided parameters again.
Even if all that is not implemented immediately.
We need something that will let you specify just a modulus for hash
partitions, a start, end, and interval for range partitions, and a list
of bounds for list partitions. If we're willing to create a new
keyword, we could make PARTITIONS a keyword. Then:
PARTITION BY HASH (whatever) PARTITIONS 8
I think that it should reuse already existing keywords, i.e. MODULUS
should appear somewhere.
Maybe:
... PARTITION BY HASH (whatever)
[ CREATE [IMMEDIATE | DEFERRED] PARTITIONS (MODULUS 8) |
NOCREATE or maybe NO CREATE ];
This way the 3 cases are syntactically covered. Then they just need to be
implemented:-) The IMMEDIATE case for HASH is pretty straightforward.
PARTITION BY RANGE (whatever) PARTITIONS FROM 'some value' TO 'some
later value' ADD 'some delta'
Robert Eckhardt "greenplum" syntax for ranges looks okay as well, and
cover some corner cases (default, included/excluded bound...).
PARTITION BY LIST (whatever) PARTITIONS ('bound', 'other bound',
('multiple', 'bounds', 'same', 'partition'))
Possibly.
That looks fairly clean. The method used to generate the names of the
backing tables would need some thought.
Pg has a history of doing simple things, eg $ stuff on constraints, _pk
for primary keys... I would not look too far.
The ALTER thing would be a little pain.
Why would we need to do anything about ALTER? I'd view this as a
convenience way to set up a bunch of initial partitions, nothing more.
I'm naïve: I'd like that the user could change their mind about a given
parameter and change it with ALTER:-)
--
Fabien.