Oracle 10g中获取DUAL表记录数

2008-08-21 15:44:18 来源: 作者: 点击:
Oracle中的DUAL表是很特殊的一张表,这种表只有一个字段,一条记录。Oracle很多查询的结果都通过访问这张表实现。所以很多包都依赖这张表。



  Oracle中的DUAL表是很特殊的一张表,这种表只有一个字段,一条记录。Oracle很多查询的结果都通过访问这张表实现。所以很多包都依赖这张表。

  由于这张表的特殊性,SQL语句的优化器进行了特殊的处理,比如在9i中:

 SQL> CONN /@YTK92 AS SYSDBA已连接。
  SQL> SELECT * FROM DUAL;
  D
  -
  X
  SQL> INSERT INTO DUAL VALUES ('X');
  已创建 1 行。
  SQL> SELECT * FROM DUAL;
  D
  -
  X
  SQL> SELECT COUNT(*) FROM DUAL;
  COUNT(*)
  ----------
  2
  SQL> ROLLBACK;


  回退已完成。

SQL> SELECT * FROM V$VERSION;
  BANNER
  ----------------------------------------------------------------
  Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production
  CORE 9.2.0.3.0 Production
  TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
  NLSRTL Version 9.2.0.4.0 - Production


  在9i的SQL优化器中,Oracle知道DUAL表只有一条记录,因此即使插入新的记录后,SELECT * FROM DUAL仍然返回一条记录。

  而使用COUNT(*)的话,则会返回DUAL表中真正的记录数。

  但是10g的SQL优化器进行了进一步调整,而且10g还增加了FAST DUAL这种执行计划,因此得到的结果和9i有了区别:

 SQL> CONN /@YTK102 AS SYSDBA已连接。
  SQL> SELECT * FROM DUAL;
  D
  -
  X
  SQL> INSERT INTO DUAL VALUES ('X');


  已创建 1 行。

SQL> SELECT * FROM DUAL;
  D
  -
  X
  SQL> SELECT COUNT(*) FROM DUAL;
  COUNT(*)
  ----------
  1
  SQL> SELECT * FROM V$VERSION;
  BANNER
  ----------------------------------------------------------------
  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
  PL/SQL Release 10.2.0.1.0 - Production
  CORE 10.2.0.1.0 Production
  TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
  NLSRTL Version 10.2.0.1.0 - Production


  可以看到,10g的优化器中即使是COUNT(*)查询,返回的总数也是1。

  也就是说,没有办法通过SQL获得DUAL表中真正的记录数。

  虽然SQL中没有办法,但是PL/SQL是可以的,否则也不会导致EXPDP等操作报错了。  

SQL> BEGIN
  2 FOR I IN (SELECT * FROM DUAL) LOOP
  3 DBMS_OUTPUT.PUT_LINE(I.DUMMY);
  4 END LOOP;
  5 END;
  6 /
  X
  X


  PL/SQL 过程已成功完成。 

SQL> ROLLBACK;


  回退已完成。

  通过这个结果也可以看出,SQL优化器和PL/SQL优化器在处理DUAL表上的区别。



本类最新行业评测技巧教程学院
本类热点本日本周本月
本类推荐本日本周本月

广告联系 | 版权说明 | 意见建议 | 加入收藏 | 军网站群 [ 军软件园 - 军软件商城 - 军软件园论坛 ]

电信与信息服务业务经营许可证:京ICP证050203