Gregory Stark wrote: > There are a few things going on here. > > 1) The optimizer can't build a plan which ignores those partitions > because the statistics are just approximations. You could insert into > one of them at any time and the statistics won't update immediately. If > you have a partition which is empty of some type of data you can put a > constraint on it to promise the optimizer that that condition will stay > true. I actually do have constraints on all the partitions, e.g. for week 34: Check constraints [for email_2007_week34]: "email_2007_week34_ts_check" CHECK (ts >= '2007-08-20 00:00:00'::timestamp without time zone AND ts < '2007-08-27 00:00:00'::timestamp without time zone) Check constraints [for email_2007_week34_extras]: "email_2007_week34_extras_ts_check" CHECK (ts >= '2007-08-20 00:00:00'::timestamp without time zone AND ts < '2007-08-27 00:00:00'::timestamp without time zone) Shouldn't this be enough to give the query planner a clue that it only has to join the "email" and "email_extras" tables' partitions pair-wise, as opposed to cross-joining them? For the record, I also have indexes: Indexes [for email_2007_week34]: "email_2007_week34_pkey" PRIMARY KEY, btree (id) "index_email_2007_week34_on_helo" btree (helo) "index_email_2007_week34_on_ip" btree (ip) "index_email_2007_week34_on_load_id" btree (load_id) "index_email_2007_week34_on_mfrom" btree (mfrom) "index_email_2007_week34_on_ts" btree (ts) Indexes [for for email_2007_week34_extras]: "email_2007_week34_extras_pkey" PRIMARY KEY, btree (id) > 2) The optimizer is assuming that empty tables have a default 1,000 > records in them with no idea about their statistics. Otherwise you get > terrible plans on tables which have just been created or never > analyzed. In this case that's causing it to think there will be tons of > matches on what is apparently a very selective criterion. I see. But this shouldn't matter under the assumption that constraint exclusion works correctly, right? > 3) The optimizer is a bit dumb about partitioned tables. But I'm not > sure if that's actually the fault here. > > Try adding one record of data to each of those partitions or putting a > constraint on them which will allow constraint_exclusion (I assume you > have that enabled?) to kick in. You'll still be bitten by the parent > table but hopefully that's not enough to cause a problem. The parent table is empty. How will adding one record to each of the partitions make a difference given the above constraints? Julian.
Attachment:
signature.asc
Description: This is a digitally signed message part.