Thread

Commits

  1. In load_relcache_init_file, initialize rd_pdcxt.

  2. Speed up dropping tables with many partitions.

  1. Dropping a partitioned table takes too long

    Amit Langote <langote_amit_f8@lab.ntt.co.jp> — 2017-04-25T07:07:17Z

    $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.
    
    Thoughts?
    
    Adding this to the open items list.
    
    Thanks,
    Amit
    
    PS: this was actually mentioned by Ragnar Ouchterlony who reported some
    bugs back in declarative partitioning in January [1]
    
    [1]
    https://www.postgresql.org/message-id/17d89e08-874b-c1b1-aa46-12d5afb26235%40agama.tv
    
  2. Re: Dropping a partitioned table takes too long

    高增琦 <pgf00a@gmail.com> — 2017-04-25T11:07:40Z

    The attached patch try to replace 'heap_open' with 'LockRelationOid' when
    locking parent table.
    It improved dropping a table with 7000 partitions.
    
    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.
    >
    > Thoughts?
    >
    > Adding this to the open items list.
    >
    > Thanks,
    > Amit
    >
    > PS: this was actually mentioned by Ragnar Ouchterlony who reported some
    > bugs back in declarative partitioning in January [1]
    >
    > [1]
    > https://www.postgresql.org/message-id/17d89e08-874b-c1b1-
    > aa46-12d5afb26235%40agama.tv
    >
    >
    > --
    > Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
    > To make changes to your subscription:
    > http://www.postgresql.org/mailpref/pgsql-hackers
    >
    >
    
    
    -- 
    GaoZengqi
    pgf00a@gmail.com
    zengqigao@gmail.com
    
  3. Re: Dropping a partitioned table takes too long

    Ashutosh Bapat <ashutosh.bapat@enterprisedb.com> — 2017-04-25T11:55:45Z

    On Tue, Apr 25, 2017 at 12:37 PM, Amit Langote
    <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    > $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.
    >
    > Thoughts?
    >
    I am not able to undestand why does changing memory context cause so
    much difference in execution time?
    
    The way this patch uses the memory context in this patch, it's
    possible that in future we will allocate something in temporary
    context and then refer it from a longer context. Instead, may be we
    should free things specially or change memory context only when
    allocating those things.
    -- 
    Best Wishes,
    Ashutosh Bapat
    EnterpriseDB Corporation
    The Postgres Database Company
    
    
    
  4. Re: Dropping a partitioned table takes too long

    Amit Langote <langote_amit_f8@lab.ntt.co.jp> — 2017-04-26T02:05:27Z

    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
    
    
    
    
  5. Re: Dropping a partitioned table takes too long

    Amit Langote <langote_amit_f8@lab.ntt.co.jp> — 2017-04-26T02:14:29Z

    On 2017/04/25 20:55, Ashutosh Bapat wrote:
    > On Tue, Apr 25, 2017 at 12:37 PM, Amit Langote
    > <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    >> $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.
    >>
    >> Thoughts?
    >>
    > I am not able to undestand why does changing memory context cause so
    > much difference in execution time?
    > 
    > The way this patch uses the memory context in this patch, it's
    > possible that in future we will allocate something in temporary
    > context and then refer it from a longer context. Instead, may be we
    > should free things specially or change memory context only when
    > allocating those things.
    
    Actually, I am withdrawing this patch for time being, because a much
    direct and better solution has been offered upthread by GaoZengqi.
    Anyway, temporary context added by my patch would not contain any objects
    that will be accessed outside of RelationBuildPartitionDesc().  Remember
    that the content that we put into the longer-lived rd_partdesc uses the
    memory allocated in rd_pdcxt, not the temporary context that I proposed.
    
    Thanks,
    Amit
    
    
    
    
  6. Re: Dropping a partitioned table takes too long

    Robert Haas <robertmhaas@gmail.com> — 2017-04-26T16:15:03Z

    On Tue, Apr 25, 2017 at 10:05 PM, Amit Langote
    <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    >> 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.
    
    Does anyone wish to object to this patch as untimely?
    
    If not, I'll commit it.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise PostgreSQL Company
    
    
    
  7. Re: Dropping a partitioned table takes too long

    Peter Eisentraut <peter.eisentraut@2ndquadrant.com> — 2017-04-26T16:21:39Z

    On 4/26/17 12:15, Robert Haas wrote:
    > On Tue, Apr 25, 2017 at 10:05 PM, Amit Langote
    > <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    >>> 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.
    > 
    > Does anyone wish to object to this patch as untimely?
    > 
    > If not, I'll commit it.
    
    Seems quite reasonable.
    
    -- 
    Peter Eisentraut              http://www.2ndQuadrant.com/
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
    
    
    
  8. Re: Dropping a partitioned table takes too long

    Tom Lane <tgl@sss.pgh.pa.us> — 2017-04-26T16:22:13Z

    Robert Haas <robertmhaas@gmail.com> writes:
    > On Tue, Apr 25, 2017 at 10:05 PM, Amit Langote
    > <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    >> Your patch seems to be a much better solution to the problem, thanks.
    
    > Does anyone wish to object to this patch as untimely?
    
    > If not, I'll commit it.
    
    It's certainly not untimely to address such problems.  What I'm wondering
    is if we should commit both patches.  Avoiding an unnecessary heap_open
    is certainly a good thing, but it seems like the memory leak addressed
    by the first patch might still be of concern in other scenarios.
    
    			regards, tom lane
    
    
    
  9. Re: Dropping a partitioned table takes too long

    Robert Haas <robertmhaas@gmail.com> — 2017-04-26T16:33:05Z

    On Wed, Apr 26, 2017 at 12:22 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Robert Haas <robertmhaas@gmail.com> writes:
    >> On Tue, Apr 25, 2017 at 10:05 PM, Amit Langote
    >> <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    >>> Your patch seems to be a much better solution to the problem, thanks.
    >
    >> Does anyone wish to object to this patch as untimely?
    >
    >> If not, I'll commit it.
    >
    > It's certainly not untimely to address such problems.  What I'm wondering
    > is if we should commit both patches.  Avoiding an unnecessary heap_open
    > is certainly a good thing, but it seems like the memory leak addressed
    > by the first patch might still be of concern in other scenarios.
    
    I will defer to you on that.  If you think that patch is a good idea,
    please have at it.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise PostgreSQL Company
    
    
    
  10. Re: Dropping a partitioned table takes too long

    高增琦 <pgf00a@gmail.com> — 2017-04-28T10:12:15Z

    It seems that in 'load_relcache_init_file()', we forget to initialize
    'rd_pdcxt' of relcache.
    
    2017-04-27 0:33 GMT+08:00 Robert Haas <robertmhaas@gmail.com>:
    
    > On Wed, Apr 26, 2017 at 12:22 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > > Robert Haas <robertmhaas@gmail.com> writes:
    > >> On Tue, Apr 25, 2017 at 10:05 PM, Amit Langote
    > >> <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    > >>> Your patch seems to be a much better solution to the problem, thanks.
    > >
    > >> Does anyone wish to object to this patch as untimely?
    > >
    > >> If not, I'll commit it.
    > >
    > > It's certainly not untimely to address such problems.  What I'm wondering
    > > is if we should commit both patches.  Avoiding an unnecessary heap_open
    > > is certainly a good thing, but it seems like the memory leak addressed
    > > by the first patch might still be of concern in other scenarios.
    >
    > I will defer to you on that.  If you think that patch is a good idea,
    > please have at it.
    >
    > --
    > Robert Haas
    > EnterpriseDB: http://www.enterprisedb.com
    > The Enterprise PostgreSQL Company
    >
    
    
    
    -- 
    GaoZengqi
    pgf00a@gmail.com
    zengqigao@gmail.com
    
  11. Re: Dropping a partitioned table takes too long

    Robert Haas <robertmhaas@gmail.com> — 2017-04-28T18:03:29Z

    On Wed, Apr 26, 2017 at 12:21 PM, Peter Eisentraut
    <peter.eisentraut@2ndquadrant.com> wrote:
    > On 4/26/17 12:15, Robert Haas wrote:
    >> On Tue, Apr 25, 2017 at 10:05 PM, Amit Langote
    >> <Langote_Amit_f8@lab.ntt.co.jp> wrote:
    >>>> 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.
    >>
    >> Does anyone wish to object to this patch as untimely?
    >>
    >> If not, I'll commit it.
    >
    > Seems quite reasonable.
    
    OK, done.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise PostgreSQL Company
    
    
    
  12. Re: Dropping a partitioned table takes too long

    Robert Haas <robertmhaas@gmail.com> — 2017-04-28T18:08:05Z

    On Fri, Apr 28, 2017 at 6:12 AM, 高增琦 <pgf00a@gmail.com> wrote:
    > It seems that in 'load_relcache_init_file()', we forget to initialize
    > 'rd_pdcxt' of relcache.
    
    Fixed.  Thanks.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise PostgreSQL Company