PostgreSQL 预编译语句 prepare,execute 语句

PostgreSQL 支持预编译语句功能,即同一类型的 SQL 语句,只是参数不同,这样的 SQL 语句只需要一次编译(prepare),就可以多次 执行(execute),在执行时传入不同的参数。

语法示例:

prepare p1(text,int) as update t set name=$1 where id=$2;
execute p1('a', 1);
execute p1('b', 2);

select  * from pg_prepared_statement(); -- 查询所有缓存的prepare语句

deallocate p1;  -- 释放缓存的p1
deallocate all; -- 释放所有缓存的prepare语句

内核实现分析:

prepare/execute 语句的实现代码主要在 src/backend/commands/prepare.c 文件。

backend 进程会缓存 prepare 语句,通过其名称将一个 prepare 语句放入 hash 表中,连接断开,缓存的 prepare 语句就会丢失。

static HTAB *prepared_queries = NULL;

执行 prepare 语句时,对应的处理函数如下:

void
PrepareQuery(ParseState *pstate, PrepareStmt *stmt,
             int stmt_location, int stmt_len)

执行 execute 语句时,对应的处理函数如下:

void
ExecuteQuery(ParseState *pstate,
             ExecuteStmt *stmt, IntoClause *intoClause,
             ParamListInfo params,
             DestReceiver *dest, QueryCompletion *qc)

执行 explain execute 语句时,对应的处理函数如下:

void
ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es,
                    const char *queryString, ParamListInfo params,
                    QueryEnvironment *queryEnv)

文章评论

0条评论