发表于:2006.11.21 13:59
分类: Oracle
出处:http://xsb.itpub.net/post/419/230902
---------------------------------------------------------------
从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真的是呼之欲出了






