用explain plan for select count(*) from V_View 看看他都做了什么样的操作,参照着想办法,效率问题只能通过这种办法,具体问题具体分析。对于特定的数据,同样的sql可能效率都不一样的。
解决方案 »
- timestamp 如何更新数据
- PLSQL 循环语句问题
- 请问,如何调用带输入参数的过程
- 用多线程写的JAVA类,查询Oracle数据库,但每执行一次,死链接就增加,大家帮帮忙!谢谢!
- oracle循环赋值
- 一个难以解决的sql问题
- 怎样才能真正理解“实例”!!!!!我是初学者
- 当发生除数为零的事件,是否可以用触发器之类的东西发现这个错误,将此列的值赋为零。我之所以这样是因为..
- 在vc中新建一个oracle数据库项目后,为什么我建的表一个都看不见?
- 如何同时使用游标变量和动态SQL?
- 求sql语句的写法
- 刚到Oracle版本.准备天天送分:顺便学习,第三个问题:SQL 存储过程转换成 Oracle 的问题:
那个索引我在其他地方要用到。
[A] 在select/delete/update后写/*+ hint */
如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*和+之间不能有空格
如何用hint指定使用某个索引select /*+ index(cbotab) */ col1 from cbotab;
select /*+ index(cbotab cbotab1) */ col1 from cbotab;
select /*+ index(a cbotab1) */ col1 from cbotab a;
其中
TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;
INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;
如果索引名或表名写错了,那这个hint就会被忽略;
[A]在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:
表test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)。
在正常情况下,where a=? and b=? and c=?会用到索引inx_a,
where b=?会用到索引inx_b
但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。
当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。
where a=? and b=? and c=? group by b||'' --如果b是字符
where a=? and b=? and c=? group by b+0 --如果b是数字
通过这样简单的改变,往往可以是查询时间提交很多倍
当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:
select /*+ no_index(t,inx_b) */ * from test t
where a=? and b=? and c=? group by b
观察语句有没有用到索引