Generic function for partitioning function? - Mailing list pgsql-general

From Gregory Haase
Subject Generic function for partitioning function?
Date
Msg-id CAHA6QFR0RiL-PRNFf76dOwYwr4N4p7TD2TeK=n6HotxWAVvtyw@mail.gmail.com
Whole thread Raw
Responses Re: Generic function for partitioning function?  (Jeff Janes <jeff.janes@gmail.com>)
Re: Generic function for partitioning function?  (Martin Collins <martin@mkcollins.org>)
List pgsql-general
I am working on a date-based partitioning framework and I would really like to have a single function that could be used as trigger for any table that needs to be partitioned by day. I am working in a rails environment, so every table has a created_at datetime field.

I created my generic function:

create or replace function day_partition_insert_trigger()
returns trigger as $$
declare
    ins_tbl varchar;
begin
    ins_tbl     :=  TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME || '_' || to_char(NEW.created_at,'YYYYMMDD');
    execute 'insert into '|| ins_tbl ||' select ($1).*' using NEW;
    return null;
end;
$$ language plpgsql;

And then I assigned the function to two different test tables to make sure it would work:

create trigger insert_daily_trigger before insert on testdailyone for each row execute procedure day_partition_insert_trigger();
create trigger insert_daily_trigger before insert on testdailytwo for each row execute procedure day_partition_insert_trigger();

Inserts work fine, and I was able to validate records are being inserted into the correct child tables.

I began to wonder if there would be a performance degradation, so I changed the testdailytwo trigger function the typical if, elsif described in the partitioning documentation and then ran pgbench against both tables.

I noticed that with 7 partitions, the if, elsif was slightly faster (~8%). However, when adding 30 partitions, the if, elsif version became slower. I'd sort of expected this.

So, my conclusion is that the generic function will work, and it will make administration (even automated administration) of partitioned tables much simpler.

My question is...  Is there a compelling reason why I should NOT do this. I must confess, it seems so straightforward that I feel like I must be missing something.

Thanks,

Greg Haase

pgsql-general by date:

Previous
From: Peter Geoghegan
Date:
Subject: Re: Call for design: PostgreSQL mugs
Next
From: Adrian Klaver
Date:
Subject: Re: store multiple rows with the SELECT INTO statement