免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1105 | 回复: 0
打印 上一主题 下一主题

[RAID与磁盘阵列] Oracle10g的FAST DUAL执行计划 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-16 10:45 |只看该作者 |倒序浏览
FAST DUAL执行计划是Oracle10g的新特性。对于利用DUAL进行的计算,可以不用真正的访问表,从而快速的得到结果。
这个改变似乎并不起眼,但是累计起来对于系统的影响就是很大的。
下面看一个实际系统中的例子,由于中间件采用了WEBLOGIC,中间件为了确保数据库连接没有问题,需要在每个SQL前面执行一个SELECT 1 FROM DUAL语句,通过这个执行过程来检测数据库连接是否正常。
如果不设置连接检查,那么一旦网络出现故障,可能导致这个连接后面所有的SQL运行出错。
虽然只是一个SELECT 1 FROM DUAL语句,但是由于执行次数众多,在V$SQL中已经可以看到执行次数和BUFFER_GETS:
SQL> SELECT EXECUTIONS, BUFFER_GETS FROM V$SQL WHERE SQL_TEXT = 'SELECT 1 FROM DUAL';
EXECUTIONS BUFFER_GETS
---------- -----------
27674608 83025056
1 row selected.
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Solaris: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
虽然一次DUAL表的访问一般只有3个逻辑读,但是积少成多。在另一个产品库中,居然发生了溢出:
SQL> SELECT EXECUTIONS, BUFFER_GETS FROM V$SQL WHERE SQL_TEXT = 'SELECT 1 FROM DUAL';
EXECUTIONS BUFFER_GETS
---------- -----------
743695660 -2.064E+09
关于BUFFER_GETS溢出的描述可以参考:
http://yangtingkun.itpub.net/post/468/385990
最后来看看10g的产品库:
SQL> SELECT EXECUTIONS, BUFFER_GETS FROM V$SQL WHERE SQL_TEXT = 'SELECT 1 FROM DUAL';
EXECUTIONS BUFFER_GETS
---------- -----------
48321325 110
将近5千万次执行,而BUFFER_GETS才110。这就是10g的新特性FAST DUAL的功劳。
SQL> SET AUTOT ON
SQL> SELECT 1 FROM DUAL;
1
----------
1
已选择 1 行。
执行计划
----------------------------------------------------------
Plan hash value: 1546270724
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
509 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> SELECT * FROM DUAL;
D
-
X
已选择 1 行。
执行计划
----------------------------------------------------------
Plan hash value: 3543395131
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
512 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
如果是用DUAL表进行计算,而不是从中取出记录的话,Oracle采用了FAST DUAL执行计划,而没有真正访问表,因此逻辑读为0;对比SELECT * FROM DUAL,由于Oracle仍然要访问DUAL表才能取出其中的内容,因此仍然需要三个逻辑读。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66684/showart_1083203.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP