Re: Partitioning with range types

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Jeremy Finzel <finzelj(at)gmail(dot)com>
Cc: Postgres General <pgsql-general(at)postgresql(dot)org>
Subject: Re: Partitioning with range types
Date: 2018-06-15 20:17:19
Message-ID: 4436d75c-6257-4626-f262-56ed95af7e34@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 06/15/2018 09:59 AM, Jeremy Finzel wrote:
>
>
> On Fri, Jun 15, 2018 at 11:23 AM, Adrian Klaver
> <adrian(dot)klaver(at)aklaver(dot)com <mailto:adrian(dot)klaver(at)aklaver(dot)com>> wrote:
>
> On 06/15/2018 08:26 AM, Jeremy Finzel wrote:
>
> Several months ago we had some detailed discussions about
> whether to use separate date columns to indicate a date range,
> or to use the daterange data type.  We opted for the latter
> because this type is specifically designed for this use case - a
> table that has a range of valid dates for the data it contains.
> It also has some great operators and functions.
>
> But I recently discovered that daterange is not supported in any
> way as a partition key because it depends on an expression.  I
> was excited
>
>
> A quick test:
>
> Postgres 10.4
>
> create table dr_partition(id integer, dr daterange) PARTITION BY
> LIST(dr);
>
>  \d dr_partition
>              Table "public.dr_partition"
>  Column |   Type    | Collation | Nullable | Default
> --------+-----------+-----------+----------+---------
>  id     | integer   |           |          |
>  dr     | daterange |           |          |
> Partition key: LIST (dr)
>
>
> create table dr_1 PARTITION OF dr_partition FOR VALUES IN
> ('[06/01/2018, 06/30/2018]');
>
> \d dr_1
>                  Table "public.dr_1"
>  Column |   Type    | Collation | Nullable | Default
> --------+-----------+-----------+----------+---------
>  id     | integer   |           |          |
>  dr     | daterange |           |          |
> Partition of: dr_partition FOR VALUES IN ('[2018-06-01,2018-07-01)')
>
>
>
> about this possibility in pg11 with unique constraints on the
> parent table, but now it appears it may have instead been to our
> advantage if we had two separate date columns instead, so that
> we could use UPSERT transparently for date-ranged tables.
>
> Is there any possibility of this feature coming for range types,
> or, if we really want to partition using daterange, should we
> look instead at two separate date columns?
>
> Thanks,
> Jeremy
>
>
>
> --
> Adrian Klaver
> adrian(dot)klaver(at)aklaver(dot)com <mailto:adrian(dot)klaver(at)aklaver(dot)com>
>
>
> Let me clarify - what I said was not accurate.  What I meant is that
> using an UPSERT on a parent partition is not supported with range types
> specifically because we can't create unique indexes involving
> expressions on parent partitions:
>
> CREATE UNIQUE INDEX ON foo (id, lower(as_of_date));
> ERROR:  unsupported UNIQUE constraint with partition key definition
> DETAIL:  UNIQUE constraints cannot be used when partition keys include
> expressions.

Would it be possible to show all the schema involved in the above?

>
> Workaround is of course not to use UPSERT, but we all know the
> advantages of using UPSERT to handle concurrency and the like and to
> make our queries simpler.  We are currently using UPSERT for many of
> these tables, but they are not partitioned yet.
>
> Thanks,
> Jeremy

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Bruno Wolff III 2018-06-15 20:25:05 Re: Trying to understand odd trigger behavior
Previous Message Adrian Klaver 2018-06-15 19:57:49 Re: Clarifying "timestamp with time zone"