能否不用count()函数而是用其他方法呢?
解决方案 »
- ORA-01153
- 学pl/sql的好资料,哪个有呢?
- 本人想在广州找份oracle数据库开发相关的工作.求推荐?
- error number 求教
- ORA-24333: zero iteration count
- 存储过程报ORA-01722无效数字错误
- 在oracle 中如何 把 long 型的数据 通过函数转化为 varchar2 或者 char 型啊
- 请大家说一下SQL语句中exits和in的用法和作用!
- 各位大哥一个让我头疼了一天的sql语句?
- 向数据库发展的迷惑,请高手们解答,500分以上等待满意答案!!!
- 更改user1的所有表的表空间后怎样重建所有的索引?
- 如何修改Oracle9i的nls_date_format参数?
可能你索引建得不好吧.
WHERE条件后的字段基本上都要建索引.
而且如果是建组合索引的话
出现WHERE条件后的第一个字段必须是组合索引的第一项.
这样索引才能起到作用.
像你这种情况,除了建索引,好像没有其它什么改进的方法.
期待其它朋友有好的见解.
这样建不可能比不建慢的,
试试看,
其实我觉得你的时间还算是比较正常的。
或:
SELECT * FROM A WHERE (NOT) EXISTS (SELECT * FROM B WHERE A.**=B.**)
等子查询
我也试过了where条件中加入rownum=1来使返回的结果简化,可是查询效率跟之前相差不多。我现在的业务需求是只要能够知道“是否存在”满足条件的记录就行了,其实根本不关心有多少条记录满足条件,所以我认为应该还有更好的方法来实现。
where exists (select 1 from a,b where a.id=b.id and ...);
from a,b where a.id=b.aid and a.dept = '01' and a.flag = 'Y' and b.productid = 'ABC'只不过满足查询条件的记录很多,有40万行。
该查询用到的索引如下:a表有复合索引:(id,dept,flag),b表索引:(productid)当然,这两个表还建有其他的索引。
用了exists查询方法后效率确实提高了很多,但还没有到令人满意的程度。
from a,b where a.id=b.aid and a.dept = '01' and a.flag = 'Y' and b.productid = 'ABC'可以看到a表的所有字段都在索引中,那你可以试试索引扫描。
select /*+ index_ffs(a 索引名称)*/ count(a.id)
from a,b where a.id=b.aid and a.dept = '01' and a.flag = 'Y' and b.productid = 'ABC'
你的完整的SQL语句是不是就是这个?别又删删减减啦,对于语句优化,不怕你写的问题复杂,就怕你写的简单。
根据你的sql,这个索引被充分利用,非常好b表索引:(productid)
非常有可能是这个索引降低了你的效率,如果用(id, productid)做索引,当然是最理想的,但即使单单用(id)索引,也应该比(productid)效率高。100万、400万纪录只能算是很普通的表,我认为你的这句sql改成exists之后如果执行计划正确的话,运行时间应该在秒级,2-3秒钟甚至更短。
的主表ID或者你字段的时间排序试试
可以加快数据量的读取速度时间的优先级最高
select 1 from dual
where exists (select 1 from a,b where a.id=b.id and ...);
已经使查询速度提高到了毫秒级。以前对sql编写不是很注意,导致很多查询效率低下,在用户数据量小的情况下暴露不出来,随着数据量的增长,很多看似简单的sql都可能出现很大的效率问题,以后真得好好注意了。
多谢各位的指导!