用explain plan for select count(*) from V_View 看看他都做了什么样的操作,参照着想办法,效率问题只能通过这种办法,具体问题具体分析。对于特定的数据,同样的sql可能效率都不一样的。
解决方案 »
- Firefox 无法建立到 localhost:8080 服务器的连接。
- 怎样通过视图或者存储过程显示表信息?
- 急!关于DATE数据类型
- 遇见麻烦的问题,oracle9i FOR linux 安装的问题,请大家帮帮我~~在线等,急急~~~~~~~~~~~~
- 很急!请问Orale 9i企业版和Oracle Lite有什么区别?都能开发部署吗?是否像Sql Server和MSDE?
- 打开服务管理面板,为何服务启动不了?!!
- 真正的高手请进
- PL/SQL中g_cursor是什么类型啊??
- 为何distinct只能影响一列呢
- ORACLE 9i,怎么解java的des加密啊?
- 求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
观察语句有没有用到索引