zoukankan      html  css  js  c++  java
  • PostgreSQL在何处处理 sql查询之二十一

    接前面:

    回到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 获得的是一条链表指针,沿着这条链表,可以计算出所读取的数据库文件的块大小。

  • 相关阅读:
    memmove 的实现
    [转]SGI STL 红黑树(Red-Black Tree)源代码分析
    [转]让我看了很有感触
    [转]C++ list 类学习笔记
    [转]码农自白:这样成为谷歌工程师
    [转]Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
    泛型指针,原生指针和智能指针
    [转]C++基本功和 Design Pattern系列 ctor & dtor
    python+opencv滤波操作
    python+opencv阈值
  • 原文地址:https://www.cnblogs.com/gaojian/p/3102075.html
Copyright © 2011-2022 走看看