li
  当前位置:主页 > 性能优化 > 文章内容
li
缺少GROUP BY表达式可以顺利执行的问题(二)
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:2  
本文章共2704字,分2页,当前第1页,快速翻页:
 

Oracle9204上执行一个明显语法错误的SQL,却可以得到查询结果。

网友gclizh指出,使用MERGE提示可以在10g中避免错误的发生而得到执行结果。根据这个结果进一步分析问题。

缺少GROUP BY表达式可以顺利执行的问题:http://yangtingkun.itpub.net/post/468/451079


使用提示MERGE,可以在10g中重现这个问题。说明这个问题的引入是由于Oracle将内层子查询进行MERGE操作,把GROUP BY操作放在了最后。

10G中使用MERGE提示可以重现这个问题:

SQL> CONN YANGTK/YANGTK@YTK102已连接。
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

SQL> CREATE TABLE T1 AS SELECT * FROM DBA_OBJECTS;

表已创建。

SQL> CREATE TABLE T2 AS SELECT * FROM DBA_USERS;

表已创建。

SQL> SELECT USERNAME, OBJECT_TYPE, CN
2 FROM (SELECT OWNER, OBJECT_TYPE, COUNT(*) CN FROM T1 GROUP BY OBJECT_TYPE), T2
3 WHERE USERNAME = OWNER
4 AND USERNAME LIKE 'SYS%';
FROM (SELECT OWNER, OBJECT_TYPE, COUNT(*) CN FROM T1 GROUP BY OBJECT_TYPE), T2
*
2 行出现错误:
ORA-00979:
不是 GROUP BY 表达式


SQL> SET AUTOT ON EXP
SQL> SELECT /* MERGE(T) */ USERNAME, OBJECT_TYPE, CN
2 FROM (SELECT OWNER, OBJECT_TYPE, COUNT(*) CN FROM T1 GROUP BY OBJECT_TYPE) T, T2
3 WHERE USERNAME = OWNER
4 AND USERNAME LIKE 'SYS%';

USERNAME OBJECT_TYPE CN
------------------------------ ------------------- ----------
SYS PACKAGE BODY 497
SYSTEM VIEW 12
SYS LIBRARY 111
SYS RULE SET 11
SYSTEM INDEX PARTITION 32
.
.
.
SYS SCHEDULE 1
SYS JOB 4
SYSMAN TYPE 212
SYSMAN PROCEDURE 2

IXDBA.NET社区论坛

已选择66行。

执行计划
----------------------------------------------------------
Plan hash value: 51733071

----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6813 | 379K| 167 (4)| 00:00:03 |
| 1 | HASH GROUP BY | | 6813 | 379K| 167 (4)| 00:00:03 |
|* 2 | HASH JOIN | | 6813 | 379K| 165 (3)| 00:00:02 |
|* 3 | TABLE ACCESS FULL| T2 | 3 | 87 | 3 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL| T1 | 22710 | 620K| 162 (3)| 00:00:02 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("USERNAME"="OWNER")
3 - filter("USERNAME" LIKE 'SYS%')



阅读更多内容1 · 2 · 下一页>>


  上一篇: 使用SQL判断一个数是否质数   下一篇: 临时表产生REDO过多的bug
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·使用SQL判断一个数是否质数
·9i上使用CONNECT BY访问DUAL表的...
·数据库升级造成的X_$BH状态异常问...
·表异常增大的bug
·Oracle10201在Enterprise Linux ...
·ORA-600(ktsircinfo_num1)错误
·函数索引产生隐藏列
·如何确定导致刷新组刷新失败的物...
·使用当前用户的数据库链的实现
·添加字段对SQL的影响
·临时表产生REDO过多的bug
·ORA-21561错误
·缺少GROUP BY表达式可以顺利执行...
·Oracle11g物理STANDBY应用日志时...
·用SQL计算100以内的质数
·用SQL实现99乘法表
·使用nlsparam的一个例子
·用SQL解决两道有趣的题(二)
·用SQL解决两道有趣的题(一)
·RAC环境的STANDBY数据库备份报错
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接