Executor¶
执行器生命周期¶
| 阶段 | 核心函数 | 关键动作 | 节点操作 |
|---|---|---|---|
| Init | ExecutorStart |
解析计划树,构建运行时状态树,打开表,编译表达式。 | ExecInitNode: Plan -> PlanState |
| Run | ExecutorRun |
循环拉取数据,逐行处理,发送给客户端 | ExecProcNode: TupleTableSlot, ExprContext |
| Finish | ExecutorFinish |
执行排队的 AFTER 触发器,更新统计信息 | AfterTriggerEndQuery |
| End | ExecutorEnd |
关闭文件/扫描描述符,销毁临时占用资源 | ExecEndNode |
执行流程梳理¶
/* Portal & Executor */
CreatePortal
PortalDefineQuery // portal->stmts = plantree_list;
PortalStart // Prepare a portal for execution. params, strategy, queryDesc
ExecutorStart // prepare the plan for execution
standard_ExecutorStart
InitPlan /* Initialize the plan state tree */
ExecInitNode
ExecInitSeqScan
ExecOpenScanRelation
PORTAL_READY
PortalRun - PortalRunSelect
/* Executor */
ExecutorRun - tandard_ExecutorRun - ExecutePlan // Processes the query plan until retrieved 'numberTuples' tuples
ExecProcNode - ExecSeqScan
ExecScan - ExecScanFetch - SeqNext // executor module
/* Access + Storage*/
table_scan_getnextslot - heap_getnextslot - heapgettup_pagemode
heapgetpage - ReadBufferExtended - ReadBuffer_common
LockBuffer(buffer, BUFFER_LOCK_SHARE);
BufferGetPage - BufferGetBlock
return (Block) (BufferBlocks + ((Size) (buffer - 1)) * BLCKSZ);
for (lineoff = FirstOffsetNumber; lineoff <= lines; lineoff++)
PageGetItemId // Returns an item identifier of a page.
return &((PageHeader) page)->pd_linp[offsetNumber - 1];
PageGetItem // Retrieves an item on the given page.
return (Item) (((char *) page) + ItemIdGetOffset(itemId));
// True if heap tuple satisfies a time qual
HeapTupleSatisfiesVisibility - HeapTupleSatisfiesMVCC
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
ExecStorePinnedBufferHeapTuple // buffer tuple -> tuple table
tts_buffer_heap_store_tuple
IncrBufferRefCount
return slot;
ExecProject
PortalDrop
PortalCleanup
ExecutorFinish
ExecPostprocessPlan
AfterTriggerEndQuery
ExecutorEnd
ExecEndPlan
ExecEndNode
FreeQueryDesc
PortalHashTableDelete(portal)
ResourceOwnerRelease
MemoryContextDelete(portal->portalContext);
pfree(portal);
finish_xact_command
CommitTransactionCommand
CommitTransaction
核心数据结构(TODO)
- Portal
- QueryDesc
- EState
- PlanState
- TupleTableSlot
- TupleDesc