PostgreSQL在何处处理 sql查询之三十四

本文通过修改表对应文件名称的方式,验证了在PostgreSQL中,一旦执行计划准备完毕,系统将保持对文件的打开句柄不变,除非因为LRU等算法导致句柄被移除。文章详细记录了从解析查询到执行查询的整个过程。

接前面,回溯调用关系:

exec_simple_query --> PortalStart --> ExecutorStart --> StandardExecutorStart --> InitPlan

再回到 exec_simple_query 来:

事前知道,表 tst04 对应的文件名为 16393。

复制代码
postgres=# select oid from pg_class where relname='tst04';
  oid  
-------
 16393
(1 row)

postgres=# 
复制代码

看 exec_simple_query,加点调试信息:

复制代码
static void
exec_simple_query(const char *query_string)
{
    ...
    parsetree_list = pg_parse_query(query_string);
    ...
    /*
     * Run through the raw parsetree(s) and process each one.
     */
    foreach(parsetree_item, parsetree_list)
    {
        ...
        querytree_list = pg_analyze_and_rewrite(parsetree, query_string,NULL, 0);
        plantree_list = pg_plan_queries(querytree_list, 0, NULL);
        ...
        portal = CreatePortal("", true, true);
        ...
        PortalDefineQuery(portal,
                          NULL,
                          query_string,
                          commandTag,
                          plantree_list,
                          NULL);
        ...
        PortalStart(portal, NULL, 0, snapshot_set);
        ...

        fprintf(stderr,"Before we call PortalRun,Now sleep for 120 seconds!!!\n");
        sleep(120);

        /*
         * Run the portal to completion, and then drop it (and the receiver).
         */
        (void) PortalRun(portal,
                         FETCH_ALL,
                         isTopLevel,
                         receiver,
                         receiver,
                         completionTag);

        fprintf(stderr,"After we call PortalRun!!!\n");
        ...
    }                            /* end loop over parsetrees */
    ...
}
复制代码

在PortalRun之前,让它休眠120秒,在此期间,将 tst04表对应文件改名。

测试发现,改名对执行无影响、在同一客户端,再次发起对同名表的sql问,没有问题:

复制代码
[postgres@lex pgsql]$ ./bin/pg_ctl -D ./data start
server starting
[postgres@lex pgsql]$ LOG:  database system was shut down at 2013-05-30 13:15:52 CST
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections
Before we call PortalRun,Now sleep for 120 seconds!!!
After we call PortalRun!!!
Before we call PortalRun,Now sleep for 120 seconds!!!
After we call PortalRun!!!
复制代码

 

[postgres@lex 12788]$ mv 16393 16393.bak
[postgres@lex 12788]$ 

 

复制代码
postgres=# select val from tst04;
 val 
-----
 100
 200
 300
(3 rows)

postgres=# select id from tst04;
 id 
----
  1
  2
  3
(3 rows)

postgres=# 
复制代码

这说明:一旦准备好了执行计划,对文件的打开句柄将保持(除非因lru之类算法被移除)。








本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2013/05/30/3108018.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值