接前面:

回到mdopen上来,看看是谁调用了 mdopen,又获得了什么。

/**    mdnblocks() -- Get the number of blocks stored in a relation.**        Important side effect: all active segments of the relation are opened*        and added to the mdfd_chain list.  If this routine has not been*        called, then only segments up to the last one actually touched*        are present in the chain.*/
BlockNumber
mdnblocks(SMgrRelation reln, ForkNumber forknum)
{MdfdVec    *v = mdopen(reln, forknum, EXTENSION_FAIL);BlockNumber nblocks;BlockNumber segno = 0;/** Skip through any segments that aren't the last one, to avoid redundant* seeks on them.  We have previously verified that these segments are* exactly RELSEG_SIZE long, and it's useless to recheck that each time.** NOTE: this assumption could only be wrong if another backend has* truncated the relation.    We rely on higher code levels to handle that* scenario by closing and re-opening the md fd, which is handled via* relcache flush.    (Since the checkpointer doesn't participate in* relcache flush, it could have segment chain entries for inactive* segments; that's OK because the checkpointer never needs to compute* relation size.)*/while (v->mdfd_chain != NULL){segno++;v = v->mdfd_chain;}for (;;){nblocks = _mdnblocks(reln, forknum, v);     if (nblocks > ((BlockNumber) RELSEG_SIZE))        elog(FATAL, "segment too big");     if (nblocks < ((BlockNumber) RELSEG_SIZE))        return (segno * ((BlockNumber) RELSEG_SIZE)) + nblocks;
        ...v = v->mdfd_chain;}
}

mdopen 获得的是一条链表指针,沿着这条链表,可以计算出所读取的数据库文件的块大小。

转载于:https://www.cnblogs.com/gaojian/archive/2013/05/28/3102075.html

PostgreSQL在何处处理 sql查询之二十一相关推荐

  1. PostgreSQL在何处处理 sql查询之二十二

    接前面. 回到程序调用关系上来: estimate_rel_size -> RelationGetNumberOfBlocks->RelationGetNumberOfBlocksINFo ...

  2. PostgreSQL在何处处理 sql查询之二

    在exec_simple_query中,代码如下: 1 /* 2 * exec_simple_query 3 * 4 * Execute a "simple Query" prot ...

  3. PostgreSQL在何处处理 sql查询之五十二

    开始 /** Ready to do the primary planning.*/final_rel = make_one_rel(root, joinlist); 展开: /** make_one ...

  4. PostgreSQL在何处处理 sql查询之十二

    接前面,对 subquery_planner,进行进一步的分析: /*--------------------* subquery_planner* Invokes the planner on a ...

  5. PostgreSQL在何处处理 sql查询之六十二

    对 RelOptInfo * make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2) 函数进行研究: 看看 inner ...

  6. PostgreSQL在何处处理 sql查询之五十一

    继续分析 query_planner: /** query_planner* Generate a path (that is, a simplified plan) for a basic quer ...

  7. PostgreSQL在何处处理 sql查询之四十七

    再次上溯: /*--------------------* subquery_planner* Invokes the planner on a subquery. We recurse to her ...

  8. PostgreSQL在何处处理 sql查询

    如果我开一个psql窗口,来输入sql文,它在数据库的何处被解析?在何处被"真正"处理? postgres.c 的 int PostgresMain(int argc, char ...

  9. PostgreSQL在何处处理 sql查询之五十四

    接前面,从 cheapeast_path 的角度,关注 query_planner 函数,对其进行简化: void query_planner(PlannerInfo *root, List *tli ...

最新文章

  1. linux 远程访问
  2. Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间
  3. c语言源程序要求每行只能书写一条语句,C语言章节习题集(全)
  4. linux下查看无线网卡的命令,lspci命令可看无线网卡 ifconfig看不到 如何操作
  5. Backbone - create model的实现原理
  6. mysql获取离当前数据最近的数据_Mysql 获取最近数据信息
  7. SpringMVC自动配置
  8. 如何准确估计机器人的状态,增强机器人控制的精度及稳定性
  9. 一些JavaScript题目
  10. 如何过滤掉xml中的转义字符_水肥一体化应用中如何选择过滤器?
  11. 苹果Mac如何使用Tuxera NTFS 格式化磁盘?
  12. java整数int的32位输出
  13. Windows 相关镜像及补丁下载地址
  14. java面试简历项目经验,java面试题项目中的难点
  15. 私有化单机题库管理软件“题库管家”1.3版本正式发布,windows版与mac版下载地址
  16. python实现12306火车票查询
  17. 【云原生之k8s】k8s安全机制
  18. 面试难题:本机号码一键登录原理,你知道吗?
  19. 【我的Android进阶之旅】SQLite出错时候的错误码整理
  20. adb命令查看应用权限赋予情况

热门文章

  1. Matlab中Ksdensity()函数的用途 (2011-04-02 16:55:17)
  2. Eureka 服务注册与发现02——集群版
  3. ArrayList练习——存储随机、存储自定义、按指定格式输出、筛选集合
  4. Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
  5. JavaScript 技术篇-js获取表格元素tr、th、td相对于父节点的索引。
  6. Python+selenium 自动化-chrome驱动的下载安装
  7. C++ leetcode 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外
  8. 二叉树的前序中序后序递归查找,深度,广度搜索C++实现(VS2017)
  9. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)
  10. matlab绘图 subplot函数使用方法