您的位置:首页 > 数据库

PostgreSQL在何处处理 sql查询之二十一

2013-05-28 08:34 417 查看
接前面:

回到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 获得的是一条链表指针,沿着这条链表,可以计算出所读取的数据库文件的块大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: