可笑的优化:LECCO Sql Expert

movingboy 2003-01-21 01:49:55
在Oracle数据库中创建两个表,脚本如下:
create table t_a (
id number(10,0),
num number(16,6),
constraint pk_t_a primary key (id)
)/
create table t_b (
id number(10,0),
num number(16,6),
constraint pk_t_b primary key (id)
)/

再放入一点数据,脚本如下:
insert into t_a values(1, 100);
insert into t_a values(2, 300);
insert into t_a values(3, 500);
insert into t_a values(4, 700);
insert into t_a values(5, 900);

insert into t_b values(3, 600);
insert into t_b values(4, 800);
insert into t_b values(6, 1200);
commit;

写出原始的Sql如下:
update t_a a
set num = (select num from t_b where id = a.id)
where id in (select id from t_b);

优化后的结果之一如下:
update t_a a
set num = (select num
from t_b
where id = a.id)
where EXISTS (SELECT 'X'
from t_b
WHERE id = id)

可是,优化是正确的吗?
执行原始脚本后结果是
id num
1 100
2 300
3 600
4 800
5 900
而执行优化后的脚本结果是
id num
1 (null)
2 (null)
3 600
4 800
5 (null)
可笑吧?!!!不知道Sql Expert是怎样优化的,原本想用它来改善性能,看来……
我的测试环境:Oracle 9i,Sql Expert Pro 3.3.2
...全文
156 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
movingboy 2003-01-21
  • 打赏
  • 举报
回复
biti_rainy(biti_rainy)说得对。我也重新测了一下,就是这个原因。
biti_rainy 2003-01-21
  • 打赏
  • 举报
回复
找出问题的原因了

也先使用了sql expert连接可数据库
然后再在数据库中创建了表?

连接数据库的时候sql expert会把数据字典抓下来,因为解析的时候在本地会快
而这个时候如果本地数据字典和数据库不同步,则sql expert把id 当作变量而不是一个列了

解决办法:
1:可以在菜单下手工选择同步更新数据字典
2:先创建表,再连接数据库
biti_rainy 2003-01-21
  • 打赏
  • 举报
回复

看起来是有bug呀
也许,还会存在其他的bug呢

看起来是很搞笑 :)

不过凡是不太武断了才是
也许人家能成功也有人家的长处
不是么?

MicroMouse 2003-01-21
  • 打赏
  • 举报
回复
优化后的语句:
where EXISTS (SELECT 'X'
from t_b
WHERE id = id)
这里的 WHERE id = id 是一个恒真的判断,导致整个WHERE条件失效了。
正确应该是:
where EXISTS (SELECT 'X'
from t_b
WHERE id = a.id)

看来这个软件也不怎样呀,吹的很凶的。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧