sql查询效率低的疑惑,请大家帮忙看一下哦???

[复制链接]
查看11 | 回复8 | 2007-7-4 17:27:50 | 显示全部楼层 |阅读模式
select * from edw_acct_item a,prod_info o
where a.serv_id=o.prod_id
and o.account in ('111122','11133')
两个表情况说明:1.都是两个大表,数量百万级;
2.a表有索引serv_id,o表有建索引account
执行计划:见附件
--->上述查询,会全量查询 edw_acct_item,查询效率非常低,2分钟还查询不出来,请问如何解决哦?

而如果换成
select * from edw_acct_item a,prod_info o
where a.serv_id=o.prod_id
and o.account in ('111122')

--》则不会全表扫描a表,而且能用到索引,查询速度非常快,何解??

回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
执行计划中,base用户,就是所说的a表,为了少打一些字
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
你目前得到的执行计划不一定是真实的,用autotrace或dbms_xplan.display_cursor来获取execution plan, 具体如何用,网上收集一下即可

回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
试试这个?
select * from edw_acct_item a
where
a.serv_id exists (select o.prod_id from prod_info o where o.account in ('111122','11133'))
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
谢谢楼上,oracle中exists没有这样写法的哦
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
select count(*) from prod_info o;
select count(*) from prod_info o where o.account in ('111122','11133');
分别结果多少?
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
会不会是因为account='11133'占了表的大部分数据造成cbo选择全表扫描
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
写错了,不好意思。
select * from edw_acct_item a
where
exists (select o.prod_id from prod_info o where o.account in ('111122','11133'))

回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
1、最终的结果返回了多少行?
2、如BELL6248版主所言,要基于真实的执行计划来分析问题,否则,很可能从一开始就会在一个错误的方向上。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行