xsb Oracle Blog
自我介绍
切换风格
订阅我的Blog
博客日历
文章归档...
最新发表...
最多阅读文章...
博客统计...
网站链接...
资源
===========================================================
group by的应用误区和10gR2里的BUG
===========================================================

从9i升级到10gR2时,以往排好序的报表突然出现了乱序,查代码,发现select ... from tb group by ..没有强制使用order by ,虽然在以前的环境中得到的就是期望的排序结果集,可到了10gR2里不灵了!!!并且这还是一个严重BUG!(有可能导致统计结果不对!!!)


HASH GROUP BY can give wrong result in Oracle 10.2 还有 http://www.dba-oracle.com/t_bug_2423687_wrong_count.htm
可能是10gR2的内部算法开始有变(sort group by --->hash group by, _gby_hash_aggregation_enabled隐藏参数=false可以设置成原来的
http://xzh2000.itpub.net/post/96/228455)

仔细翻阅了Oracle各版本的官方文档http://tahiti.oracle.com/ 均明确注明:

The GROUP BY clause groups rows but does not guarantee the order of the result set. To order the groupings, use the ORDER BY clause.

可现实是10gR2之前的版本group by返回的结果集的确是排序的!到了10gR2就不是了!有兴趣的不妨试试!

测试数据:
create table t2(id1 number,id2 varchar2(4000));
insert into t2 values (1,dbms_random.string('a',4000));
insert into t2 values (1,dbms_random.string('a',4000));
insert into t2 values (3,dbms_random.string('a',4000));
insert into t2 values (3,dbms_random.string('a',4000));
insert into t2 values (2,dbms_random.string('a',4000));
insert into t2 values (2,dbms_random.string('a',4000));
insert into t2 values (4,dbms_random.string('a',4000));
insert into t2 values (4,dbms_random.string('a',4000));
insert into t2 values (2,dbms_random.string('a',4000));
insert into t2 values (2,dbms_random.string('a',4000));
insert into t2 values (1,dbms_random.string('a',4000));
insert into t2 values (1,dbms_random.string('a',4000));
select id1,count(*) from t2 group by id1;

在9i(或10gR1)和10gR2中你会得到不一样的结果集。

10gR2还有一严重BUG[zt] http://www.itpub.net/showthread.php?threadid=506143&pagenumber=
现象:监听器启动后,隔一段时间(长短不定),就会出现无法
连接: 若是用10201版本的SQLPLUS,则会出现 NO LISTENER。
9207 版本的SQLPLUS,则会出现:没反应,HANG住。

原因:10201 版本上的一个BUG:4518443。其会自动创建一个子
监听器,当出现此情况时,监听器将会挂起。
这个更可怕, 因为得到错误数据还不知道

create table test_bug (tbl_name varchar2(30));
insert into test_bug values ('TEST_BUG');

select table_name
from user_tables
where table_name in (select table_name from test_bug);

Oracle 不报错, 结果也不是预想的结果. 一定要写成

select table_name
from user_tables
where table_name in (select t.table_name from test_bug t);

看来Oracle11g真的是呼之欲出了

xsb 发表于:2006.11.21 13:59 ::分类: ( Oracle ) ::阅读:(1385次) :: 评论 (4) :: 引用 (0)
re: group by的应用误区和10gR2里的BUG [回复]

收藏之

小I机器人 评论于:2007.03.28 13:36
re: group by的应用误区和10gR2里的BUG [回复]

group by排序其实不是bug,oracle的文档中就说明了group by不保证数据排序,要排序得用order by。其实这个排序是跟parallel有关,如果不采用并行则group by还是会排序的

Twinkle 评论于:2007.04.06 15:51
re: group by的应用误区和10gR2里的BUG [回复]

xsb, 你好,你所说的第二个bug的确是一个很大的问题。即使改变成你最后一种写法oracle会报错“ORA-00904: "T"."TABLE_NAME": invalid identifier”。这个似乎以前版本的oracle就存在了,好像和一些保留字有关,在9iR2中也存在。另外,例如使用user,remark,column之类的保留字作为表的一部分会有错误。所以在表设计的时候不推荐使用这样的命名方法。

hzl1984 评论于:2007.05.17 17:19
re: group by的应用误区和10gR2里的BUG [回复]

create table test_bug (tbl_name varchar2(30));
insert into test_bug values ('TEST_BUG');

select table_name
from user_tables
where table_name in (select table_name from test_bug);

Oracle 不报错, 结果也不是预想的结果. 一定要写成

select table_name
from user_tables
where table_name in (select t.table_name from test_bug t);

兄弟,是你故意還是失手呀,,,呵...

test_bug 中的欄位tbl_name 是..
select table_name
from user_tables
where table_name in (select t.table_name from test_bug t);
這個能通過嗎﹖特意指定 test_bug表的欄位﹐可你的名稱并不是 table_name呀﹐而是 tbl_name 。。

而對于沒有別名強制指定﹐﹐子句中的欄位可以看成是 主表或/子句表中的任意欄位﹐只要有其存在。

yong.z 评论于:2007.07.06 13:31

发表评论
标题

在此添加评论

称呼

邮箱地址(可选)

个人主页(可选)

authimage