Re: Dropping a partitioned table takes too long

Amit Langote <langote_amit_f8@lab.ntt.co.jp>

From: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>
To: 高增琦 <pgf00a@gmail.com>
Cc: Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2017-04-26T02:05:27Z
Lists: pgsql-hackers
Hi,

On 2017/04/25 20:07, 高增琦 wrote:
> 
> 2017-04-25 15:07 GMT+08:00 Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>:
> 
>> $SUBJECT, if the table has, say, 2000 partitions.
>>
>> The main reason seems to be that RelationBuildPartitionDesc() will be
>> called that many times within the same transaction, which perhaps we
>> cannot do much about right away.  But one thing we could do is to reduce
>> the impact of memory allocations it does.  They are currently leaked into
>> the caller's context, which may not be reset immediately (such as
>> PortalHeapMemory).  Instead of doing it in the caller's context, use a
>> temporary context that is deleted before returning.  Attached is a patch
>> for that.  On my local development VM, `drop table
>> table_with_2000_partitions` finished in 27 seconds with the patch instead
>> of more than 20 minutes that it currently takes.
>
> The attached patch try to replace 'heap_open' with 'LockRelationOid' when
> locking parent table.
> It improved dropping a table with 7000 partitions.

Your patch seems to be a much better solution to the problem, thanks.

Regards,
Amit



Commits

  1. In load_relcache_init_file, initialize rd_pdcxt.

  2. Speed up dropping tables with many partitions.