上一页 1 ··· 48 49 50 51 52 53 54 55 56 ··· 104 下一页
摘要: 再次回到 estimate_rel_size 我发现,在入口参数 rel中,rel->rd_rel->reltuples 的值已经完全准备好了:/* * estimate_rel_size - estimate # pages and # tuples in a table or index * * We also estimate the fraction of the pages that are marked all-visible in * the visibility map, for use in estimation of index-only scans. * * 阅读全文
posted @ 2013-05-28 14:36 健哥的数据花园 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 接前面。回到程序调用关系上来:estimate_rel_size -> RelationGetNumberOfBlocks->RelationGetNumberOfBlocksINFork->Smgrnblocks->mdnblocks...折腾了一圈,就是为了评估一个表的大小。那么,我们所获得的block,它到底是个什么单位?BlockNumbermdnblocks(SMgrRelation reln, ForkNumber forknum){ MdfdVec *v = mdopen(reln, forknum, EXTENSION_FAIL); BlockNumbe 阅读全文
posted @ 2013-05-28 13:29 健哥的数据花园 阅读(579) 评论(0) 推荐(0) 编辑
摘要: 接前面:回到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 ... 阅读全文
posted @ 2013-05-28 08:34 健哥的数据花园 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 看代码:/* * mdopen() -- Open the specified relation. * * Note we only open the first segment, when there are multiple segments. * * If first segment is not present, either ereport or return NULL according * to "behavior". We treat EXTENSION_CREATE the same as EXTENSION_FAIL; * EXTENSION_CREAT 阅读全文
posted @ 2013-05-27 18:24 健哥的数据花园 阅读(339) 评论(0) 推荐(0) 编辑
摘要: 在网上学到的,备忘:[root@lex tst]# cat gao3.c#include <stdio.h>#include <string.h>char * function1 (char *p){ printf("In function1 %s\n",p); return p;}char * function2 (char *p){ printf("In function2 %s\n",p); return p;}char * function3 (char *p){ printf("In function3 %s\ 阅读全文
posted @ 2013-05-27 15:01 健哥的数据花园 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 再回过头来看/* * open a file in an arbitrary directory * * NB: if the passed pathname is relative (which it usually is), * it will be interpreted relative to the process' working directory * (which should always be $PGDATA when this code is running). */FilePathNameOpenFile(FileName fileName, int fileF 阅读全文
posted @ 2013-05-27 13:25 健哥的数据花园 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 看PostgreSQL中的代码:/* Debugging.... */#ifdef FDDEBUG#define DO_DB(A) A#else#define DO_DB(A) /* A */#endif此后,在为定义 FDDEBUG的情况下,如果执行 DO_DB(function1());就相当于 /*function1();*/,也就是什么都不执行而且,如果对PostgreSQL进行查找,发现 没有定义 FDDEBUG 的地方,估计哪个开发者自己手工加入的吧:[root@lex ttt]# find ./ | xargs grep "FDDEBUG"Bina... 阅读全文
posted @ 2013-05-27 09:48 健哥的数据花园 阅读(651) 评论(0) 推荐(0) 编辑
摘要: 接前面,由于看到对BasicOpenFile 函数的调用。自然想到,如果两个进程同时访问一个表(即同一文件),会否有冲突或效率的问题。开两个psql客户端,连接数据库后,后台生成两个进程,分别运行 select * from tst01 进行观察...发现各进程之间互相不干扰。我实验的方法,加入调试代码:/* * BasicOpenFile --- same as open(2) except can free other FDs if needed * * This is exported for use by places that really want a plain kernel F 阅读全文
posted @ 2013-05-26 15:43 健哥的数据花园 阅读(403) 评论(0) 推荐(0) 编辑
摘要: PostgreSQL中, cluster是 根,是一个目录,一般是base。base之下,一个数据库拥有一个目录。每建立一个数据库,就会在base下再新建一个目录。如果在某数据库下建立了表,则在该数据库的目录下,会建立一个文件对应着这个表。如何查询呢:假如我有一个表名为 tst01,则可以查询其oid:postgres=# select oid from pg_class where relname='tst01'; oid ------- 16384(1 row)postgres=# 查看base下的目录,可以看到同名文件:[root@lex 12788]# ls /usr/ 阅读全文
posted @ 2013-05-25 08:57 健哥的数据花园 阅读(2244) 评论(0) 推荐(0) 编辑
摘要: VFD是为了解决文件句柄的限制,防止把OS级别的文件句柄用光。原来我认为VFD是各个进程间共有的。但是根据观察,发现每一个进程都拥有自己的VFD数组指针。看看下面两段加了调试信息后的代码:InitFileAccess:从VfdCache = (Vfd *) malloc(sizeof(Vfd)) 基本可以断定,没有使用共享内存方式/* * InitFileAccess --- initialize this module during backend startup * * This is called during either normal or standalone backend st 阅读全文
posted @ 2013-05-24 15:34 健哥的数据花园 阅读(407) 评论(0) 推荐(0) 编辑
上一页 1 ··· 48 49 50 51 52 53 54 55 56 ··· 104 下一页