补充:《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()是面向事物隔离性的快照维护工作。


  1. pg_parse_query(sql)负责parser工作,注意sql可能有很多条语句;

  2. pg_analyze_and_rewrite()负责bind和rewrite的工作;

  3. pg_plan_queries()进行优化器计划生成的工作;

  4. PortalRun()完成物理计划的执行;