!4770 修复大分区表数量时频繁内存不足问题

Merge pull request !4770 from 吴岳川/master
This commit is contained in:
opengauss_bot
2024-01-23 02:00:51 +00:00
committed by Gitee
6 changed files with 30 additions and 24 deletions

View File

@ -338,6 +338,16 @@ static void SpecialWorkOfRelationLocInfo(Relation rel)
static void SpecialWorkForLocalRel(Relation rel)
{
if (rel->partMap != NULL && rel->partMap->type == PART_TYPE_LIST) {
ListPartitionMap *rel_lpm = (ListPartitionMap *)rel->partMap;
/* copy part key hash-table */
BuildPartKeyHashTable(rel_lpm);
for (int partSeq = 0; partSeq < rel_lpm->listElementsNum; partSeq++) {
ListPartElement *lpe = &(rel_lpm->listElements[partSeq]);
InsertPartKeyHashTable(rel_lpm, lpe, partSeq);
}
}
if (RelationIsIndex(rel)) {
rel->rd_aminfo = (RelationAmInfo *)MemoryContextAllocZero(rel->rd_indexcxt, sizeof(RelationAmInfo));
}

View File

@ -62,8 +62,6 @@
#include "utils/datum.h"
#include "utils/knl_relcache.h"
static void InsertPartKeyHashTable(ListPartitionMap *listMap, ListPartElement *partElem, int partSeqNo);
static HTAB *BuildPartKeyHashTable(ListPartitionMap *listMap);
static uint32 PartKeyHashFunc(const void *key, Size keysize);
static int PartKeyMatchFunc(const void *key1, const void *key2, Size keysize);
@ -1300,13 +1298,6 @@ ListPartitionMap *CopyListPartitionMap(ListPartitionMap *src_lpm)
dst_lpm->listElementsNum = src_lpm->listElementsNum;
dst_lpm->listElements = CopyListElements(src_lpm->listElements, src_lpm->listElementsNum);
/* copy part key hash-table */
dst_lpm->ht = BuildPartKeyHashTable(dst_lpm);
for (int partSeq = 0; partSeq < dst_lpm->listElementsNum; partSeq++) {
ListPartElement *lpe = &(dst_lpm->listElements[partSeq]);
InsertPartKeyHashTable(dst_lpm, lpe, partSeq);
}
return dst_lpm;
}
@ -1726,7 +1717,7 @@ static int PartKeyMatchFunc(const void *key1, const void *key2, Size keysize)
return ret;
}
static HTAB *BuildPartKeyHashTable(ListPartitionMap *listMap)
HTAB *BuildPartKeyHashTable(ListPartitionMap *listMap)
{
HASHCTL hashCtl;
errno_t rc;
@ -1742,8 +1733,10 @@ static HTAB *BuildPartKeyHashTable(ListPartitionMap *listMap)
hashCtl.entrysize = sizeof(PartElementHashEntry);
hashCtl.hash = PartKeyHashFunc;
hashCtl.match = PartKeyMatchFunc;
listMap->ht = hash_create(si.data, 1024L, &hashCtl, HASH_ELEM | HASH_FUNCTION | HASH_COMPARE);
hashCtl.hcxt = LocalMyDBCacheMemCxt();
listMap->ht = hash_create(si.data, 1024L, &hashCtl, HASH_ELEM | HASH_FUNCTION | HASH_COMPARE | HASH_CONTEXT);
FreeStringInfo(&si);
return listMap->ht;
}
@ -1756,7 +1749,7 @@ static inline void DeepCopyPartKey(PartitionKey* src, PartitionKey* dst)
}
}
static void InsertPartKeyHashTable(ListPartitionMap *listMap, ListPartElement *partElem, int partSeqNo)
void InsertPartKeyHashTable(ListPartitionMap *listMap, ListPartElement *partElem, int partSeqNo)
{
Assert (listMap != NULL && partElem != NULL);

View File

@ -1208,11 +1208,6 @@ static void ExecHashIncreaseNumBuckets(HashJoinTable hashtable)
idx += MAXALIGN(HJTUPLE_OVERHEAD + HJTUPLE_MINTUPLE(hashTuple)->t_len);
}
}
#ifdef HJDEBUG
printf("Nbuckets increased to %d, average items per bucket %.1f\n", hashtable->nbuckets,
batchTuples / hashtable->nbuckets);
#endif
}
/*

View File

@ -1240,7 +1240,7 @@ restart:
*/
innerTupleSlot = GetNextBatchTuple<INNER_VAR>(node);
node->mj_InnerOffset = innerTupleSlot;
MJ_DEBUG_PROC_NODE(innerTupleSlot);
VEC_MJ_DEBUG_PROC_NODE(innerTupleSlot);
node->mj_MatchedInner = false;
/* Compute join values and check for unmatchability */
@ -1326,7 +1326,7 @@ restart:
*/
outerTupleSlot = GetNextBatchTuple<OUTER_VAR>(node);
node->mj_OuterOffset = outerTupleSlot;
MJ_DEBUG_PROC_NODE(outerTupleSlot);
VEC_MJ_DEBUG_PROC_NODE(outerTupleSlot);
node->mj_MatchedOuter = false;
/* Compute join values and check for unmatchability */
switch (MJGetOuterValues(node, outerTupleSlot)) {
@ -1553,7 +1553,7 @@ restart:
*/
outerTupleSlot = GetNextBatchTuple<OUTER_VAR>(node);
node->mj_OuterOffset = outerTupleSlot;
MJ_DEBUG_PROC_NODE(outerTupleSlot);
VEC_MJ_DEBUG_PROC_NODE(outerTupleSlot);
node->mj_MatchedOuter = false;
/* Compute join values and check for unmatchability */
@ -1607,7 +1607,7 @@ restart:
*/
innerTupleSlot = GetNextBatchTuple<INNER_VAR>(node);
node->mj_InnerOffset = innerTupleSlot;
MJ_DEBUG_PROC_NODE(innerTupleSlot);
VEC_MJ_DEBUG_PROC_NODE(innerTupleSlot);
node->mj_MatchedInner = false;
/* Compute join values and check for unmatchability */
switch (MJGetInnerValues(node, innerTupleSlot)) {
@ -1663,7 +1663,7 @@ restart:
*/
innerTupleSlot = GetNextBatchTuple<INNER_VAR>(node);
node->mj_InnerOffset = innerTupleSlot;
MJ_DEBUG_PROC_NODE(innerTupleSlot);
VEC_MJ_DEBUG_PROC_NODE(innerTupleSlot);
node->mj_MatchedInner = false;
if (BatchTupleIsNull(innerTupleSlot)) {
MJ_printf("ExecMergeJoin: end of inner subplan\n");
@ -1694,7 +1694,7 @@ restart:
*/
outerTupleSlot = GetNextBatchTuple<OUTER_VAR>(node);
node->mj_OuterOffset = outerTupleSlot;
MJ_DEBUG_PROC_NODE(outerTupleSlot);
VEC_MJ_DEBUG_PROC_NODE(outerTupleSlot);
node->mj_MatchedOuter = false;
if (BatchTupleIsNull(outerTupleSlot)) {
MJ_printf("ExecMergeJoin: end of outer subplan\n");

View File

@ -17,6 +17,7 @@
#ifndef EXECDEBUG_H
#define EXECDEBUG_H
#include "access/printtup.h"
#include "executor/executor.h"
#include "nodes/print.h"
@ -118,7 +119,6 @@
* ----------------
*/
#ifdef EXEC_MERGEJOINDEBUG
#define MJ_nodeDisplay(l) nodeDisplay(l)
#define MJ_printf(s) printf(s)
#define MJ1_printf(s, p) printf(s, p)
@ -129,6 +129,10 @@
#define MJ_DEBUG_QUAL(clause, res) MJ2_printf(" ExecQual(%s, econtext) returns %s\n", CppAsString(clause), T_OR_F(res))
#define MJ_DEBUG_PROC_NODE(slot) \
MJ2_printf(" %s = ExecProcNode(...) returns %s\n", CppAsString(slot), NULL_OR_TUPLE(slot))
/* merge join vector */
#define VEC_NULL_OR_TUPLE(slot) ((slot.m_fEmpty) ? "null" : "a tuple")
#define VEC_MJ_DEBUG_PROC_NODE(slot) \
MJ2_printf(" %s = ExecProcNode(...) returns %s\n", CppAsString(slot), VEC_NULL_OR_TUPLE(slot))
#else
#define MJ_nodeDisplay(l)
@ -140,6 +144,8 @@
#define MJ_DEBUG_COMPARE(res)
#define MJ_DEBUG_QUAL(clause, res)
#define MJ_DEBUG_PROC_NODE(slot)
#define VEC_NULL_OR_TUPLE(slot)
#define VEC_MJ_DEBUG_PROC_NODE(slot)
#endif /* EXEC_MERGEJOINDEBUG */
#endif /* ExecDebugIncluded */

View File

@ -159,6 +159,8 @@ typedef struct HashPartitionMap {
} \
} while (0)
extern void InsertPartKeyHashTable(ListPartitionMap *listMap, ListPartElement *partElem, int partSeqNo);
extern HTAB *BuildPartKeyHashTable(ListPartitionMap *listMap);
extern bool IsDefaultValueListPartition(ListPartitionMap *listMap, ListPartElement *partElem);
char *PartKeyGetCstring(PartitionKey* partkeys);
extern bool ConstEqual(Const *c1, Const *c2);