本篇内容主要讲解“PostgreSQL中的Tuplesortstate数据结构是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中的Tuplesortstate数据结构是怎样的”吧!
Tuplesortstate
Tuplesort操作的私有状态.
typedef enum
{
//装载元组,在内存限制之内
TSS_INITIAL,
//装载元组到有界堆中
TSS_BOUNDED,
//装载元组,写入到tape中
TSS_BUILDRUNS,
//完全在内存中完成排序
TSS_SORTEDINMEM,
//完成排序,最后在tape上执行排序
TSS_SORTEDONTAPE,
//不落地执行最后的归并
TSS_FINALMERGE
} TupSortStatus;
#define MINORDER 6
#define MAXORDER 500
#define TAPE_BUFFER_OVERHEAD BLCKSZ
#define MERGE_BUFFER_SIZE (BLCKSZ * 32)
typedef int (*SortTupleComparator) (const SortTuple *a, const SortTuple *b,
Tuplesortstate *state);
struct Tuplesortstate
{
//状态 : 枚举值详见上面的信息
TupSortStatus status;
//sort key中的列数
int nKeys;
//调用者需要随机访问?
bool randomAccess;
//调用者是否指定了最大返回的元组的数目?
bool bounded;
//使用有界堆,则返回T
bool boundUsed;
//如为有界堆,这里存储最大的元组个数
int bound;
//SortTuple.tuple是否可以设置?
bool tuples;
//剩余可用内存大小(单位:字节)
int64 availMem;
//允许的内存总大小(单位:字节)
int64 allowedMem;
//tapes个数
int maxTapes;
//tapes个数 - 1
int tapeRange;
//主要用于排序数据的内存上下文
MemoryContext sortcontext;
//用于元组数据的sortcontext的子上下文
MemoryContext tuplecontext;
//临时文件中tapes的logtape.c对象
LogicalTapeSet *tapeset;
SortTupleComparator comparetup;
void (*copytup) (Tuplesortstate *state, SortTuple *stup, void *tup);
void (*writetup) (Tuplesortstate *state, int tapenum,
SortTuple *stup);
void (*readtup) (Tuplesortstate *state, SortTuple *stup,
int tapenum, unsigned int len);
//SortTuple结构体数组
SortTuple *memtuples;
//当前存在的元组数
int memtupcount;
//memtuples数组的已分配的大小
int memtupsize;
//memtuples的增长仍在进行中?
bool growmemtuples;
bool slabAllocatorUsed;
//slab内存空间的起始位置
char *slabMemoryBegin;
//slab内存空间的结束位置
char *slabMemoryEnd;
//链表头
SlabSlot *slabFreeHead;
//在归并期间用于读取输入tapes的缓存大小
size_t read_buffer_size;
void *lastReturnedTuple;
int currentRun;
//活跃的输入run源?
bool *mergeactive;
//Knuth's l
int Level;
//当前输出tape(Knuth's j)
int destTape;
//目标斐波拉契run计数(A[])
int *tp_fib;
//每一个tape上真正runs的编号
int *tp_runs;
//每一个tape(D[])上虚拟runs的编号
int *tp_dummy;
//实际的tape编号(TAPE[])
int *tp_tapenum;
//归并轮中的活动输入tapes编号
int activeTapes;
//已完成输出的实际tape编号
int result_tape;
//数组编号(仅用于SORTEDINMEM)
int current;
//是否到达EOF(用于游标)
bool eof_reached;
//markpos_xxx保持已标记的位置,用于标记和存储
//tape block编号(只用于SORTEDONTAPE)
long markpos_block;
//存储的"current",或者tape块中的偏移
int markpos_offset;
//存储的eof_reached
bool markpos_eof;
int worker;
Sharedsort *shared;
int nParticipants;
TupleDesc tupDesc;
//长度nKeys数组
SortSupport sortKeys;
SortSupport onlyKey;
int64 abbrevNext;
//将用于依赖的索引信息
IndexInfo *indexInfo;
//解析索引表达式的运行期状态
EState *estate;
//数据表
Relation heapRel;
//正在创建的index
Relation indexRel;
//这些仅在index_btree下使用
//如发现重复元组,则提示
bool enforceUnique;
//index_hash情况
uint32 high_mask;
uint32 low_mask;
uint32 max_buckets;
Oid datumType;
//需要typelen用于知道如何拷贝Datums.
int datumTypeLen;
#ifdef TRACE_SORT
PGRUsage ru_start;
#endif
};
到此,相信大家对“PostgreSQL中的Tuplesortstate数据结构是怎样的”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!