Re: Performance on Bulk Insert to Partitioned Table

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



________________________________
> Date: Sun, 23 Dec 2012 14:55:16 -0800 
> Subject: Re:  Performance on Bulk Insert to Partitioned Table 
> From: jeff.janes@xxxxxxxxx 
> To: charlesrg@xxxxxxxxxxx 
> CC: ondrej.ivanic@xxxxxxxxx; pgsql-performance@xxxxxxxxxxxxxx 
>  
> On Thursday, December 20, 2012, Charles Gomes wrote: 
> True, that's the same I feel, I will be looking to translate the  
> trigger to C if I can find good examples, that should accelerate. 
>  
> I think your performance bottleneck is almost certainly the dynamic  
> SQL.  Using C to generate that dynamic SQL isn't going to help much,  
> because it is still the SQL engine that has to parse, plan, and execute  
> it. 
>  
> Are the vast majority if your inserts done on any given day for records  
> from that same day or the one before; or are they evenly spread over  
> the preceding year?  If the former, you could use static SQL in IF and  
> ELSIF for those days, and fall back on the dynamic SQL for the  
> exceptions in the ELSE block.  Of course that means you have to update  
> the trigger every day. 
>  
>  
> Using rules would be totally bad as I'm partitioning daily and after  
> one year having 365 lines of IF won't be fun to maintain. 
>  
> Maintaining 365 lines of IF is what Perl was invented for.  That goes  
> for triggers w/ static SQL as well as for rules. 
>  
> If you do the static SQL in a trigger and the dates of the records are  
> evenly scattered over the preceding year, make sure your IFs are nested  
> like a binary search, not a linear search.  And if they are mostly for  
> "today's" date, then make sure you search backwards. 
>  
> Cheers, 
>  
> Jeff

Jeff, I've changed the code from dynamic to:

CREATE OR REPLACE FUNCTION quotes_insert_trigger()
RETURNS trigger AS $$
DECLARE
r_date text;
BEGIN
r_date = to_char(new.received_time, 'YYYY_MM_DD');
case r_date
    when '2012_09_10' then 
        insert into quotes_2012_09_10 values (NEW.*) using new;
        return;
    when '2012_09_11' then
        insert into quotes_2012_09_11 values (NEW.*) using new;
        return;
    when '2012_09_12' then
        insert into quotes_2012_09_12 values (NEW.*) using new;
        return;
    when '2012_09_13' then
        insert into quotes_2012_09_13 values (NEW.*) using new;
        return;
    when '2012_09_14' then
        insert into quotes_2012_09_14 values (NEW.*) using new;
        return;
    when '2012_09_15' then
        insert into quotes_2012_09_15 values (NEW.*) using new;
        return;
    when '2012_09_16' then
        insert into quotes_2012_09_16 values (NEW.*) using new;
        return;
    when '2012_09_17' then
        insert into quotes_2012_09_17 values (NEW.*) using new;
        return;
    when '2012_09_18' then
        insert into quotes_2012_09_18 values (NEW.*) using new;
        return;
    when '2012_09_19' then
        insert into quotes_2012_09_19 values (NEW.*) using new;
        return;
    when '2012_09_20' then
        insert into quotes_2012_09_20 values (NEW.*) using new;
        return;
    when '2012_09_21' then
        insert into quotes_2012_09_21 values (NEW.*) using new;
        return;
    when '2012_09_22' then
        insert into quotes_2012_09_22 values (NEW.*) using new;
        return;
    when '2012_09_23' then
        insert into quotes_2012_09_23 values (NEW.*) using new;
        return;
    when '2012_09_24' then
        insert into quotes_2012_09_24 values (NEW.*) using new;
        return;
end case
RETURN NULL;
END;
$$
LANGUAGE plpgsql;


However I've got no speed improvement.
I need to keep two weeks worth of partitions at a time, that's why all the WHEN statements.
Wish postgres could automate the partition process natively like the other sql db.

Thank you guys for your help. 		 	   		  

-- 
Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance



[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux