原帖由 biti.vector 于 2010-5-7 22:48 发表
http://publib.boulder.ibm.com/in ... c/doc/c0005400.html
原帖由 wangzhonnew 于 2010-5-8 21:14 发表
一般prefetch发生在table scan和index scan。
对于一般的index scan主要还是走sync read,但是如果访问计划里面的路径有ixscan->sort(rid)->ridscan->fetch,那么这就是说对于从index scan里面拿到的rid作排序,然后对于排序好的rid进行prefetch。
所谓prefecth就是一次读超过一个page(比如一个或者若干个extent)。
LZ应该是oracle过来的,应该比较熟悉oltp系统。对于oltp,大部分情况是每一个查询会得到1,2条记录。这几条记录可能在同一个或者不同的page里面。这样,数据库需要对于这几个rid所对应的page一个一个读。在结果集小的时候还可以,但是考虑一下如果结果集超过100万,对于每一个记录一条一条地做I/O是不大现实的。
因此,当这种情况发生的时候,db2首先对结果集里面所有的rid进行排序,然后一次读入很多个page,这样这些page里面很可能一下就包含几百上千个结果,比单个I/O要快很多。
原帖由 tom_fans 于 2010-5-9 00:12 发表
如果是这样,我基本算明白了DB2的预取是怎么的说法。
从访问路径来看也就分为:全表扫描,索引扫描(当然索引扫描又分为几种情况),如果是索引扫描,自然通过得到的RID直接可以定位到page,(从ORACLE角度来讲,除了FFS其他的索引扫描都是单块扫描,不知道要拿哪些BLOCK,自然不能通过多块,否者会拿很多无用的块)或许DB2在这个地方相对ORACLE来说做了改进,并不使用ORACLE所谓的单块来取,当然也避免不了取出无用的page。但不管如何,如果取很多数据这么做应该效率会高,但是如果按你说的数据少的话,这种做法未必是个好事。
对于全表扫描来说,ORACLE自然是通过多块来扫,一般是16×8=128K数据。 可能DB2里并没有这种多块和单块的概念,那么这里所谓的预取功能,应该和ORACLE的多块是一个概念。
不知道我对DB2的预期功能理解的对不对?
原帖由 tom_fans 于 2010-5-9 01:44 发表
哈哈,你这么晚也没睡觉啊。关于这个快慢的问题,我也用理论来推导过,我就说说我自己的看法,仅仅是客观的描述,没有感情色彩。
在谈这个问题之前,需要排除一些干扰,尤其是算法的干扰,比如定位BLOCK的HASH算法,B树索引的效率,以及生成计划过程的一些开销,仅仅是谈获得一切条件之后开始查询后的比较。
1. 锁的问题
ORACLE通过UNDO来解决select锁的问题,但是额外的开销就是构造前映像,这种构造的BLOCK可能非常多,也可能非常少,典型的就是仓库和OLTP,一些类似OLAP的报表系统算是中间的。如果排除极端情况,从经验来看,ORACLE需要20%额外的构造前映像的开销,虽然说在内存里面构造这种前映像非常的快(我测试过我solaris系统,平均1秒可以获得30W-35W的buffer gets,一个block 8k),但是每个SQL都需要这么做,必然或拖慢ORACLE的速度。 但是在更新频繁的系统,UNDO的作用毋庸置疑。
但是DB2在9.7之前select是要加锁,这必然会在并发性上比较差,但是也正是因为select加锁,不需要获取额外的block开销,如果锁资源竞争少的情况下,DB2应该会跑的比ORACLE块。 但是一旦并发高,我可以好不断言的说DB2在并发上要差至少一个档次。
2.最大IO以及多块及单块读问题(相对DB2就是预取功能了)
首先我不确定DB2有最大IO能力限制(我认为有,毕竟DB2也是构建在操作系统上),所以这个我就不说了,但是ORACLE肯定有,一次IO最多1个extent。这个extent同样要受系统IO限制。
按照开始你的说法,以及我个人的思考,DB2的预取功能上要胜过ORACLE的多块读,在数据量少的情况下应该性能一样,毕竟DB2的预取功能没发挥效率,但是数据量稍微大点,不管是通过索引还是全表扫描,DB2都胜过ORACLE。
全表扫描DB2可以获得多个extent,而且可以条带式获得,但是ORACLE一次最多在一个数据文件获取一个extent。
索引扫描,ORACLE除了FFS使用多块,也就是一次扫一个extent,其他的一定是单块,也就是一个一个叶子的找,毕竟索引物理存储上并不是像索引逻辑概念上一样有序的。 而DB2通过预取功能不做单个IO获得单个BLOCK,而是获取多个BLOCK,这必然加快查询速度。当然这时候IO能力很重要。尤其是磁盘的能力。假设排除这个可能性。
DB2要胜过ORACLE。
3.重用计划问题
2者都有这个功能,所以没办法说谁好谁差。
如果从上面几个方面讲,并发性不用比了,DB2肯定差点,所以如果OLTP使用DB2,就我个人来说,这种系统我真不敢去碰。那个锁竞争我不清楚会什么样子,select都要被堵塞,这是什么概念。除非你用脏读。但是在OLAP系统来看,DB2应该是稍微胜过ORACLE。
呵呵,这是我自己的想法,见笑了。
欢迎光临 ITPUB论坛-专业的IT技术社区 (http://www.itpub.net/) | Powered by Discuz! X3.2 |