zoukankan      html  css  js  c++  java
  • postgres SQL编译过程

      PG启动首先完成主进程和后台进程的启动,启动时完成数据库文件的打开,共享内存的建立等。接着,所有SQL都会启动1个单独的进程处理SQL的执行过程。

      新的进程首先是进行自身的初始化,最主要的是初始化内存上下文,准备好SQL处理过程。

      进入PostgresMain后,解析客户端命令行参数dbname;做文件、存储、缓存的初始化;设置合适的信号处理句柄;调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等。进入无限循环,检查并处理任何请求或者最近收到的信号。然后再接着循环。

      循环一直在ReadCommand。 进入无限循环后,切换到内存上下文"MessageContext"并清理干净该内存上下文;读取客户端命令;根据客户端各种命令分别进行处理。

      客户端发起请求,pg服务器为该请求启动一个postgres访问进程为该客户端通过访问,建立了连接。这个postgres访问进程进入无限循环,等待客户端请求并为其通过服务,直到进程终止,连接断口。

    当客户端给服务器端发出查询SQL后,建立连接时已经启动且进入无限循环的服务器端的postgres服务进程处理步骤如下:

      (1)调用MemoryContextSwitchTo切换内存上下文到"MessageContext"。

      (2)调用MemoryContextResetAndDeleteChildren清理上次为相同连接服务时"MessageContext"内存上下文里遗留的对象。

      (3)调用ReadCommand读取客户端的请求。

      (4)根据客户端请求判断要提供何种服务,进入相应分支。

     从源码的角度分析sql编译过程:

      (1)调用start_xact_command方法开启一个事务。
                 ——主要是申请1个全局唯一的事物号
      (2)pg_parse_query方法进行语法SQL解析。
      (3)pg_analyze_and_rewrite方法分析、根据规则重写解析树为查询树querytree。
      (4)pg_plan_queries方法把查询树转换到执行计划树plantree。

      对于一个简单SQL查询,主要的处理过程是先调用start_xact_command方法开启一个事务,再用pg_parse_query方法用词法语法解析工具把查询命令解析为解析树parsetree,根据需要调用PushActiveSnapshot方法搞一个快照,调用pg_analyze_and_rewrite方法分析、根据规则重写解析树为查询树querytree,调用pg_plan_queries方法把查询树转换到执行计划树plantree,在调用相应方法创建portal和在postal中执行执行计划树并给客户端发回结果。然后退出当前事务,清理内存。

      src/backend/parser下,scan.l为词法定义,gram.y为语法定义。

  • 相关阅读:
    第八次作业
    设计一款给爸爸妈妈用的手机
    第五次作业
    第四次作业(项目分析)
    第二次作业(个人项目实践)
    即时通讯软件的发展演变
    C++用法的学习心得
    JavaScript(变量、作用域和内存问题)
    一、Java和JavaScript
    使用Hyper-V创建虚拟机
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/4198248.html
Copyright © 2011-2022 走看看