日志文章

2008年03月28日 10:15:32

Oracle的consistent gets是如何计算的呢?

Oracle的consistent gets是如何计算的呢?
1.单表扫描
SQL> execute show_space('TEST1','WWJ');
Unformatted Blocks .....................           0
FS1 Blocks (0-25) .....................           0
FS2 Blocks (25-50) .....................           1
FS3 Blocks (50-75) .....................           0
FS4 Blocks (75-100).....................           0
Full Blocks     .....................         33
Total Blocks............................         40
Total Bytes.............................       327,680
Total MBytes............................           0
Unused Blocks...........................           1
Unused Bytes............................       8,192
Last Used Ext FileId....................           5
Last Used Ext BlockId...................       3,321
Last Used Block.........................           7
PL/SQL 过程已成功完成。
多次运行,获得稳定的consistent gets
SQL> select * from test1;
已选择12402行。
执行计划
----------------------------------------------------------
Plan hash value: 4122059633
---------------------------------------------------------------------------
| Id | Operation       | Name | Rows | Bytes | Cost (%CPU)| Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT |     | 12402 |   169K|   9   (0)| 00:00:01 |
|   1 | TABLE ACCESS FULL| TEST1 | 12402 |   169K|   9   (0)| 00:00:01 |
---------------------------------------------------------------------------
统计信息
----------------------------------------------------------
      0 recursive calls
      0 db block gets
    861 consistent gets
      0 physical reads
      0 redo size
  379486 bytes sent via SQL*Net to client
    9471 bytes received via SQL*Net from client
    828 SQL*Net roundtrips to/from client
      0 sorts (memory)
      0 sorts (disk)
    12402 rows processed
数据究竟分布在多少个块上?
SQL> SELECT count(DISTINCT dbms_rowid.rowid_block_number(ROWID)) FROM test1;
COUNT(DISTINCTDBMS_ROWID.ROWID
------------------------------
                  34
也可以用show_space的结果,Full Blocks + FS2 Blocks (25-50) =34
公式:consistent gets = rownum / fetch array size + used datablock
    861 = CEIL(12402 / 15) + 34
2.Hash join,TEST11表结构和TETS1一致,数据量,数据块都一致。
SQL> SELECT * FROM TEST1 A
2 WHERE NOT EXISTS(SELECT b.c1
3             FROM test11 b
4             WHERE b.c1 = a.c1)
5 /
已选择8671行。
执行计划
-------------------------------------------------------------------------------
| Id | Operation         | Name   | Rows | Bytes | Cost (%CPU)| Time   |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |     |   35 |   665 |   20 (10)| 00:00:01 |
|* 1 | HASH JOIN RIGHT ANTI|     |   35 |   665 |   20 (10)| 00:00:01 |
|   2 |   TABLE ACCESS FULL | TEST11 | 12404 | 62020 |   9   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL | TEST1 | 12402 |   169K|   9   (0)| 00:00:01 |
-------------------------------------------------------------------------------
统计信息
----------------------------------------------------------
    650 consistent gets
consistent gets = rownum / fetch array size + probe table's block
            + build table's block + 其它
probe表为test1,sql将请求他所有的块,所有产生34次一致读
build表为test11,进程将它读取到hash区域,产生34次一致读
650 = CEIL (8671/15)+34+34+4
其它也许是oracle在请求hash内存产生的内部一致读,可以忽略。
3.FILTER操作。这个sql的结果和2一样,但很低效。从对产生一致读的分析,我们还可以了解为什么filter在这里很低效。但是关于filter的机制,我找了几天也没有在任何文档看到,这里仅仅是
我自己的设想。
SQL> SELECT * FROM test1 a WHERE a.c1 NOT IN (SELECT b.c1 FROM test11 b);
已选择8671行。
执行计划
-----------------------------------------------------------------------------
| Id | Operation       | Name   | Rows | Bytes | Cost (%CPU)| Time   |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |     | 12401 |   169K| 58720   (5)| 00:11:45 |
|* 1 | FILTER         |     |     |     |         |       |
|   2 |   TABLE ACCESS FULL| TEST1 | 12402 |   169K|   9   (0)| 00:00:01 |
|* 3 |   TABLE ACCESS FULL| TEST11 |   1 |   5 |   9   (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
  1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "TEST11" "B" WHERE
        LNNVL("B"."C1"<>:B1)))
  3 - filter(LNNVL("B"."C1"<>:B1))

  PS:这里可以看出optimizer已经把sql改写为NOT EXISTS了,但是却是LNNVL("B"."C1"<>:B1)连接,已经很接近产生hash的sql。
统计信息
----------------------------------------------------------
  380719 consistent gets
首先,我认为oracle会把TEST1的所有所有数据,装载进一个list,这里产生34个一致读。然后
依次读取这个list中的每一个值,再根据这个值对TEST11进行过滤。
FILTER过滤是怎么做的呢?最初我曾经以为oracle会把两个表做descartes,然后再做<>过滤。
但和实际descartes比,成本相差太大。所以应该不是descartes。那是什么呢?
从这里观察:
TABLE ACCESS FULL| TEST11 |   1 |
这个1 是ROWS,表示这里的operation只包含一行。
再看:
  1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "TEST11" "B" WHERE
        LNNVL("B"."C1"<>:B1)))
  3 - filter(LNNVL("B"."C1"<>:B1))
LNNVL是oracle的函数,意思是IS NULL OR NOT TRUE,这样我认为过程是这样的,绑定变量:B1实际
是list的一个取值。首先判断在TEST11里面是否存在空值比较或者C1=:B1的,如果发现了一行满足条件那么NOT EXISTS条件就不成立。
java伪代码如下:
List list = new Linklist();//创建链表
list = Test1Dao.listC1();
//循环链表
while(list.size >0){
String c1 = list.remove(0);
//在test11中寻找
if(Test11Dao.find(c1)){
  //找到了,不满足条件
}else{
  //告诉client没有找到,满足,返回结果
    }
}

这样list的每一条记录都会请求test11的块,但是它的机制是发现一行即返回,所以每次他可能会扫描1~34块,产生相应数量的一致读。
那么我来模拟计算过程,通过如下SQL:
WITH t AS (
SELECT c1,dense_rank() over(ORDER BY dbms_rowid.rowid_block_number(ROWID)) bn FROM test11)
SELECT test1.c1,nvl(t.bn,34),SUM(nvl(t.bn,34)) over() FROM test1
LEFT JOIN t ON t.c1= test1.c1
结果节选如下:
rownum c1     bn     sum(bn)
1 58153 1 367199
2 55746 1 367199
3 17523 1 367199
...
550 48108 5 367199
551 22515 5 367199
552 66287 5 367199
...
4162 7724 34 367199
4163 28976 34 367199
4164 6128 34 367199
4165 39064 null 367199
4166 8441 null 367199
4167 51435 null 367199
首先,我假设oracle在做filter时候,选择数据块的顺序是和client获得数据的顺序是差不多的。
SELECT c1,dense_rank() over(ORDER BY dbms_rowid.rowid_block_number(ROWID)) bn FROM test11
获得的,是test11的数据,和每条数据按数据块位置的排序。
然后和test1做连接,这样bn的结果就是test1中每条记录,要做多少次块请求,才能获得结果。如果bn为null
说明在test11中没有test1需要的值,则需要扫描所有34块才能得知。
这样sum(sn)就统计出所有请求产生的一致读。
那么380719 ≈367199 + CEIL(8671/15)+34 +34 + 其它+误差
实际已经比较接近了。如果有人知道真相,请告诉我。
4.SQL> select * from test1 where 1=2
不会产生一致读,oracle优化器会立刻知道这是一个否条件。
0 consistent gets
5.SQL> select * from test1 where c1<0;
      37 consistent gets
除了数据存在的34个块,还有3个extent header块。
...
对一致读的计算,暂时就到这里,以后会对更多的优化器行为,做一致读算法描述。
实际本文是我在思考filter的机制的过程,所记录的(我曾在itpub发帖询问,未获答案)。

Tags: oracle   consistent  

类别: Tuning |  评论(17) |  浏览(8227) |  收藏
一共有 17 条评论
17楼 [匿名]学历职称 2009年10月30日 13:33:47 Says:
您还在为学历不够、没有职业资格证而找不到合适的工作而苦恼吗?我们为您排忧解难,为您提供国际、国内职业资格认证服务,免费提供咨询服务。详细请登录:http://www.szpx6688.cn,热线电话:0755-83190298,QQ295549145,358526773
16楼 [匿名]SEO优化之博客群 2009年09月11日 16:53:21 Says:
<BODY>腾讯搜搜于2006年上线的,最初使用的是Google的搜索技术,所以用户一般使用soso检索到的搜索结果页面与google中文搜索结果页面大同小异,在结果页面头部一固定位置也会看到“Google技术支持”的字样。而此度推出自主研发的搜索引擎,这也意味着腾讯与谷歌的合作将终止。不过,对于两者的合同何时终止,腾讯相关负责人则表示现在尚不便对外披露。另据了解,腾讯在循序渐进地进行自主技术搜搜的测试,现在,仍有一些地区的搜搜采用谷歌的技术。腾讯推出自主研发的搜索技术,这也意味着搜索引擎的竞争也将更加激烈。在搜狗、百度、谷歌等搜索引擎厂商崛起后,网易也于去年重点投入推介自主研发的搜索引擎。业内人士认为,巨头们纷纷进入搜索引擎自主研发领域,表明了他们对搜索引擎市场的重视,这也将使市场的竞争格局发生改变。今年8月初,腾讯搜搜公开招聘搜索引擎高级工程师和构架师,当时即有消息称腾讯正在酝酿推出自主研发的搜索技术。针对以上问题,我把博客网站优化技巧总结如下,希望广大的网友参考学习,大家互相进步。博客网站SEO优化其实并不是特别重要,因为博客的关键在于内容,内容为王,有了优秀而独特的内容,就很容易取得较好的排名。当然,使用一些常用的SEO优化技巧也可以更好的改善排名。这里我以Z-Blog为例介绍一下常用的博客网站SEO优化技巧。对于多用户博客,我们建议推广时候采用博客群发大师,<A href="http://blogsend.200lou.com">http://blogsend.200lou.com</A>用的适当会事半功倍。 1. 首页在哪里?你要确保在博客页面的顶部位置有一个明显的“首页”链接。 2. 将你的logo链向你的首页。 3. 增加搜索框。增加搜索框可以帮助用户很快找到他们需要的内容。 4. 自定义你的404错误页面。自定义你的404页面,使之提供更多的信息,对访问者更有帮助,是增加博客网站用户粘度的最简单的方法之一。 5. 链接文字有下划线。如果你的目标受众是不太懂电脑技术的人,这一点尤其重要。 6. 保持导航一致。在突出位置放置一个简单、易于查找的导航栏(通常在顶部位置)。 7. 经常、有规律的更新,有规律持续的发表文章比一天写六篇然后接下来的六个星期一篇都不写要好的多。 8. 增加favicon图标。许多RSS阅读器在显示你的博客文章的同时,也显示你的favicon。所以增加一个favicon,可以让你的文章在RSS阅读器中更突出。 9. 增加社会化书签按钮,方便访问者将你的博客提交给网络书签网站,这样所有访问网络书签网站的人都有机会看到你的文章。 10. 检查旧文章中是否有拼写错误。 11. 在超文本链接、图片Alt属性和网页的URL中适当的使用关键字。 12. 不要在内容中堆积关键字。搜索引擎会检查你页面的关键字密度(Keywords density)。</BODY>
15楼 [匿名]中国彩吧 2009年09月06日 16:09:52 Says:
福利彩票 . 双色球 , 中国彩吧 首页 彩吧论坛 _ 中国福利彩票发行管理中心唯一指定网络信息发布媒体 全球最大的中文福利彩票网站 中国福彩 福利彩票 双色球 福彩 3D 彩票 . 彩票网 . 福彩 , 福彩 3D, 投注站 , 风采 ,3D, 中奖 , 彩民 , 公告 , 七乐彩 , 代购 , 合买 , 公益 , 刮刮乐 , 开奖 , 走势图 , 投注 , 中彩网中国福利彩票发行管理中心唯一指定网站 , 全球最大的中文福利彩票网站 , 中奖公告、官方最新资讯发布 , 提供专业权威的彩票网上代购、合买平台 , 独家彩票开奖视频直播中国福利彩票发行管理中心唯一指定网络信息发布媒体: http://www.guojiacaipiao.cn
14楼 [匿名]国家彩票官方网 2009年09月06日 16:09:43 Says:
福利彩票 , 国家彩票官方网首页 _ 中国福利彩票发行管理中心唯一指定网络信息发布媒体 全球最大的中文福利彩票网站 中国福彩 福利彩票 双色球 福彩 3D 彩票 . 彩票网 , 双色球 , 福彩 , 福彩 3D, 投注站 , 风采 ,3D, 中奖 , 彩民 , 公告 , 七乐彩 , 代购 , 合买 , 公益 , 刮刮乐 , 开奖 , 走势图 , 投注 , 中彩网中国福利彩票发行管理中心唯一指定网站 , 全球最大的中文福利彩票网站 , 中奖公告、官方最新资讯发布 , 提供专业权威的彩票网上代购、合买平台 , 独家彩票开奖视频直播中国福利彩票发行管理中心唯一指定网络信息发布媒体: http://www.guojiacaipiao.cn
13楼 [匿名]国家彩票官方网 2009年09月05日 16:08:03 Says:
福利彩票 , 国家彩票官方网首页 _ 中国福利彩票发行管理中心唯一指定网络信息发布媒体 全球最大的中文福利彩票网站 中国福彩 福利彩票 双色球 福彩 3D 彩票 . 彩票网 , 双色球 , 福彩 , 福彩 3D, 投注站 , 风采 ,3D, 中奖 , 彩民 , 公告 , 七乐彩 , 代购 , 合买 , 公益 , 刮刮乐 , 开奖 , 走势图 , 投注 , 中彩网中国福利彩票发行管理中心唯一指定网站 , 全球最大的中文福利彩票网站 , 中奖公告、官方最新资讯发布 , 提供专业权威的彩票网上代购、合买平台 , 独家彩票开奖视频直播中国福利彩票发行管理中心唯一指定网络信息发布媒体: http://www.guojiacaipiao.cn
12楼 [匿名]北京服装厂 2009年09月02日 16:28:25 Says:
[url=http://www.b8bb.com]北京服装厂[/url]主要经营:[url=http://www.b8bb.com]工作服[/url],[url=http://www.b8bb.com]职业装[/url],[url=http://www.b8bb.com]西服[/url],[url=http://www.b8bb.com]服装厂[/url],[url=http://www.b8bb.com]衬衫[/url],[url=http://www.b8bb.com]制服[/url],[url=http://www.byb6.com]工作服[/url],[url=http://www.bshs.cn]北京服装厂[/url],[url=http://www.seooy.com]seo[/url],[url=http://www.seooy.com]北京seo[/url],[url=http://www.seooy.com]seo培训[/url],[url=http://www.seooy.com]网站优化[/url],[url=http://www.seooy.com]网站优化培训[/url],[url=http://www.seooy.com]北京网站优化[/url],[url=http://www.jflady.com]减肥产品[/url],[url=http://www.jflady.com]减肥药[/url],[url=http://www.jflady.com]减肥产品[/url],[url=http://www.62967120.com]搬家公司[/url],[url=http://www.62967120.com]北京搬家公司[/url],[url=http://www.qqmy.net]公司注册[/url],[url=http://www.qqmy.net]北京公司注册[/url],[url=http://www.qqmy.net]注册公司[/url],
详情请浏览:[url=http://www.b8bb.com]北京服装厂[/url]首页 http://www.b8bb.com
11楼 [匿名]thaousrg 2009年07月01日 16:31:12 Says:
5%E5%B9%B4%E5%AE%89%E5%85%A8%E9%A9%BE%E9%BE%84%EF%BC%8C%E7%86%9F%E6%82%89%E4%B8%8A%E6%B5%B7%E5%B8%82%E9%83%8A%EF%BC%8C%E6%B1%9F%E6%B5%99%E9%81%93%E8%B7%AF%E3
10楼 [匿名]oigy744d 2009年06月30日 01:37:27 Says:
%E4%B8%8A%E6%B5%B7%E5%88%B0%E6%B7%AE%E9%98%B4%E5%B8%82%E5%8C%85%E8%BD%A6%E3
9楼 [匿名]yektb2c3 2009年06月20日 13:26:05 Says:
CK,LEE,Levi's,%E9%98%BF%E7%8E%9B%E5%B0%BC,Armani,%E6%9D%8E%E7%BB%B4%E6%96%AF,%E6%9D%8E%E5%8D%8E%E5%A3%AB,%E7%BA%AF%E6%A3%89%E7%89%9B%E4%BB%94%E8%A3%A4,%E7%89%9B%E4%BB%94%E4%B8%93%E5%8D%96,%E6%96%B0%E5%A1%98%E7%89%9B%E4%BB%94,%3Ca%20href="http://www.cklee.cn"%20%3Ewww.cklee.cn%3C/a%3Eyektb2c3
8楼 [匿名]ckleecn 2009年06月18日 04:49:02 Says:
CK,LEE,Levi's,%E9%98%BF%E7%8E%9B%E5%B0%BC,Armani,%E6%9D%8E%E7%BB%B4%E6%96%AF,%E7%BA%AF%E6%A3%89%E7%89%9B%E4%BB%94%E8%A3%A4,%E7%89%9B%E4%BB%94%E4%B8%93%E5%8D%96,%E6%96%B0%E5%A1%98%E7%89%9B%E4%BB%94,www.cklee.cnckleecn
7楼 [匿名]fdxh7mu2 2009年06月14日 23:38:32 Says:
%E5%A6%82%E4%BD%95%E9
6楼 [匿名]avnpshtf 2009年06月14日 19:54:54 Says:
%E5%85%A8%E5%9B%BD%E6%89%93%E6%8A%98%E6%9C%BA%E7%A5%A82%E6%8A%98%E8%B5%B7%EF%BC%8C%E6%B2%88%E9%98%B3%E5%B8%82%E5%86%85%E5%85%8D%E8%B4%B9%E9
5楼 [匿名]baqnf7mg 2009年06月10日 12:59:35 Says:
%E5%85%A8%E5%9B%BD%E6%89%93%E6%8A%98%E6%9C%BA%E7%A5%A82%E6%8A%98%E8%B5%B7%EF%BC%8C%E6%B2%88%E9%98%B3%E5%B8%82%E5%86%85%E5%85%8D%E8%B4%B9%E9
4楼 [匿名]rabb5njo 2009年06月05日 22:35:44 Says:
%E5%85%A8%E5%9B%BD%E6%89%93%E6%8A%98%E6%9C%BA%E7%A5%A82%E6%8A%98%E8%B5%B7%EF%BC%8C%E6%B2%88%E9%98%B3%E5%B8%82%E5%86%85%E5%85%8D%E8%B4%B9%E9
3楼 [匿名]jkujghjg5 2009年04月30日 21:46:22 Says:
ertertjkb%20wow%20gold,%20%3Ca%20href="http://power4leveling.com/"%3Ewow%20gold%3C/a%3E%20%3Ca%20href="http://power4leveling.com/"%3Echeap%20wow%20gold%3C/a%3E,%20so%20we%20%3Ca%20href="http://power4leveling.com/"%3Ebuy%20wow%20gold%3C/a%3Ejkujghjg5
2楼 [楼主]成都 文杰 Valen Wong 2008年03月29日 22:13:56 Says:
昨天上午没写完,就出去了。。今天补上
1楼 [匿名]onlyzz 2008年03月28日 16:16:33 Says:
  老W,说实话我看了半天都没看出来你哪个地方在解释这个公式是怎么得到的 =。=||
发表评论
看不清楚,换一张