Re: Constraint Exclusion (Partitioning) - Initial Review - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Constraint Exclusion (Partitioning) - Initial Review
Date
Msg-id 200507040229.j642TbN25240@candle.pha.pa.us
Whole thread Raw
In response to Re: Constraint Exclusion (Partitioning) - Initial Review  (Simon Riggs <simon@2ndquadrant.com>)
Responses Re: Constraint Exclusion (Partitioning) - Initial Review
List pgsql-patches
Simon Riggs wrote:
> Yes, dead on. Thank you for this elegant summary. The main idea was
> originally Hannu Krosing's, I believe, with suggestion from Tom to
> enhance the partial index machinery to this end.
>
> So a query such as
>
>     select * from pm where dkey = 25000
>
> will have an EXPLAIN that completely ignores p1 and p3, since these can
> be provably excluded from the plan without effecting the result.
>
> I see the "no syntax" version as the first step towards additional
> functionality that would require additional syntax.

OK, makes sense.

> > Oh, why would someone want to set enable_constraint_exclusion to false?
>
> The included functionality performs the exclusion at plan time. If a
> query was prepared for later execution, it *could* return the wrong
> answer when the plan was executed at a later time since plans are not
> invalidated when constraints change. So, in general, this should be set
> to false except for circumstances where the user can guarantee no such
> mistake would be made.

Ah, so there is a small additional restriction (changing constraints on
planned queries) that this would affect.

> > You had a few questions:
> >
> > > Main questions:
> > > 1. How should we handle the case where *all* inherited relations are
> > > excluded? (This is not currently covered in the code).
> >
> > I assume this means we don't return any rows.  Why it is an issue?
>
> A code question only. No issue, just how should the code look?

Ah, so there is no sequential/index scan on anything then.  Don't we
have another case like this in the code?

> > > 2. Should this feature be available for all queries or just inherited
> > > relations?
> >
> > I don't see why other queries should not use this.  Our TODO already
> > has:
> >
> >     * Use CHECK constraints to influence optimizer decisions
> >
> >       CHECK constraints contain information about the distribution of values
> >       within the table. This is also useful for implementing subtables where
> >       a tables content is distributed across several subtables.
> >
> > and this looks like what you are doing.  However, again, I see the
> > constraint as just informing whether there might be any rows in the
> > table.  Am I missing something?  Are you thinking views with UNION could
> > benefit from this?
>
> In general, it seems you might want this. In normal use check
> constraints tend to be on minor columns, not key columns. Queries that
> would be provably able to exclude tables based upon this would be
> strange queries.
>
> i.e.
> select count(distinct item_pk) from warehouse where quantity < 0
>
> is not a very common query. So we would pay the overhead of checking for
> exclusion for all queries when only a few wierd ones would ever take
> advantage of it. Sounds like a poor trade-off to me.
>
> IMHO, the only time you might expect to see benefit is when you have
> many similar tables that are partitioned by design into pieces that lend
> themselves to exclusion. If you specifically designed a set of tables
> and used UNION to bring them together, then I can see that you would
> want it then also.... but is there any benefit in supporting two
> different ways of achieving the same basic design: partitioned table.

I think you are probably right with the GUC at this stage.  As the
feature is expanded in 8.2, we can then turn it on automatically and
remove the GUC.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

pgsql-patches by date:

Previous
From: Neil Conway
Date:
Subject: Re: contrib/pgcrypto patch for OpenSSL 0.9.8
Next
From: Alvaro Herrera
Date:
Subject: Re: per user/database connections limit again