补充:《PostgreSQL源码#1-6(pg如何进行debug?)》介绍了调试过程,最好把linux内核参数做一个配置,不然vscode总是提示需要root权限。
sudo sysctl -w kernel.yama.ptrace_scope=0
01
—
sql执行整体流程
sql的执行主要是postgres子进程会调用exec_simple_query函数,下面的代码给出了该函数的简化执行流程。
void exec_simple_query(sql){
start_xact_command(); // 开启事务
MemoryContextSwitchTo();
pg_parse_query(sql); // 生成parse tree list
MemoryContextSwitchTo();
foreach(parsetree_item, parsetree_list){
BeginCommand();
start_xact_command();
PushActiveSnapshot();
pg_analyze_and_rewrite(); // 生成 query tree
pg_plan_queries(); // 生成 plan tree
PopActiveSnapshot();
CreatePortal();
PortalDefineQuery();
PortalStart();
PortalSetResultFormat();
CreateDestReceiver();
PortalRun();
PortalDrop();
finish_xact_command();
EndCommand();
}
finish_xact_command(); // 结束事务
}
其中,start_xact_command()和finish_xact_command()是事务开始和结束的函数。BeginCommand()和EndCommand()是每条sql语句的开启和结束工作。PushActiveSnapshot()和PopActiveSnapshot()是面向事物隔离性的快照维护工作。
pg_parse_query(sql)负责parser工作,注意sql可能有很多条语句;
pg_analyze_and_rewrite()负责bind和rewrite的工作;
pg_plan_queries()进行优化器计划生成的工作;
PortalRun()完成物理计划的执行;