Re: Partitioning with range types - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Partitioning with range types
Date
Msg-id 4436d75c-6257-4626-f262-56ed95af7e34@aklaver.com
Whole thread Raw
In response to Re: Partitioning with range types  (Jeremy Finzel <finzelj@gmail.com>)
List pgsql-general
On 06/15/2018 09:59 AM, Jeremy Finzel wrote:
> 
> 
> On Fri, Jun 15, 2018 at 11:23 AM, Adrian Klaver 
> <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.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.klaver@aklaver.com <mailto:adrian.klaver@aklaver.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.klaver@aklaver.com


pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Clarifying "timestamp with time zone"
Next
From: Bruno Wolff III
Date:
Subject: Re: Trying to understand odd trigger behavior