• K
    Add a long living account for Relinquished Memory · 1822c826
    Kavinder Dhaliwal 提交于
    There are cases where during execution a Memory Intensive Operator (MI)
    may not use all the memory that is allocated to it. This means that this
    extra memory (quota - allocated) can be relinquished for other MI nodes
    to use during execution of a statement. For example
    
    ->  Hash Join
             ->  HashAggregate
             ->  Hash
    In the above query fragment the HashJoin operator has a MI operator for
    both its inner and outer subtree. If there ever is the case that the
    Hash node used much less memory than was given as its quota it will now
    call MemoryAccounting_DeclareDone() and the difference between its
    quota and allocated amount will be added to the allocated amount of the
    RelinquishedPool. Doing this will enable HashAggregate to request memory
    from this RelinquishedPool if it exhausts its quota to prevent spilling.
    
    This PR adds two new API's to the MemoryAccounting Framework
    
    MemoryAccounting_DeclareDone(): Add the difference between a memory
    account's quota and its allocated amount to the long living
    RelinquishedPool
    
    MemoryAccounting_RequestQuotaIncrease(): Retrieve all relinquished
    memory by incrementing an operator's operatorMemKb and setting the
    RelinquishedPool to 0
    
    Note: This PR introduces the facility for Hash to relinquish memory to
    the RelinquishedPool memory account and for the Agg operator
    (specifically HashAgg) to request an increase to its quota before it
    builds its hash table. This commit does not generally apply this
    paradigm to all MI operators
    Signed-off-by: NSambitesh Dash <sdash@pivotal.io>
    Signed-off-by: NMelanie Plageman <mplageman@pivotal.io>
    1822c826
nodeHashjoin.c 40.5 KB