博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL在何处处理 sql查询之三十四
阅读量:6340 次
发布时间:2019-06-22

本文共 2389 字,大约阅读时间需要 7 分钟。

接前面,回溯调用关系:

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 voidexec_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 startserver starting[postgres@lex pgsql]$ LOG:  database system was shut down at 2013-05-30 13:15:52 CSTLOG:  autovacuum launcher startedLOG:  database system is ready to accept connectionsBefore 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,如需转载请自行联系原作者

你可能感兴趣的文章
[LeetCode] Spiral Matrix 解题报告
查看>>
60906磁悬浮动力系统应用研究与模型搭建
查看>>
指纹获取 Fingerprint2
查看>>
SB阿里云,windows2012r2无法安装.net3.5
查看>>
1217 实验四 递归下降语法分析程序设计
查看>>
函数的继承
查看>>
黑盒测试用例设计方法&理论结合实际 -> 场景法
查看>>
快速打开软件以及文件夹
查看>>
CSS选择符
查看>>
剑指offer---19--***-顺时针打印矩阵
查看>>
关于数组随机不重复的思路
查看>>
redis 系列7 数据结构之跳跃表
查看>>
oracle赋值问题(将同一表中某一字段赋值给另外一个字段的语句)
查看>>
Windows 安装 Jenkins 2.6
查看>>
计算一个点是否在一个区域中
查看>>
正则表达式
查看>>
淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。...
查看>>
EntityFramework 6.x多个上下文迁移实现分布式事务
查看>>
高版本SQL备份在低版本SQL还原问题
查看>>
一键安装最新内核并开启 BBR 脚本
查看>>