我们做的是b/s结构的软件,最近出现了这样的问题,同一查询程序时快时慢,而且相差很大,快的2秒,慢的40秒,对于里面的查询条件已经优化过了。而且还出现,添加记录速度很慢的情况,添加相同的记录数量比以前慢很多。
我初步怀疑是不是索引太多引起的,但其实也不是太多,而且以前也基本上是这样的索引,数据库表的大小不一致,有的大一点的有几百万条记录。
而且这种情况也就是2周之前开始出现的。实在不知道如何是好。老板让我去买本oracle的书来看看,但是又不知道该买什么。
现在实在是无从下手,请高手指点,随便什么,思路也好、可能的原因也好、告诉我买什么书看也好。各位高手一定帮忙,谢谢!!
我初步怀疑是不是索引太多引起的,但其实也不是太多,而且以前也基本上是这样的索引,数据库表的大小不一致,有的大一点的有几百万条记录。
而且这种情况也就是2周之前开始出现的。实在不知道如何是好。老板让我去买本oracle的书来看看,但是又不知道该买什么。
现在实在是无从下手,请高手指点,随便什么,思路也好、可能的原因也好、告诉我买什么书看也好。各位高手一定帮忙,谢谢!!
以下情况不使用索引
select * from tablename where id+0=1
where user_name||''= 'smith'
where to_number(字段)=4
where user_name like '%D'
where user_name like 'D%'
where user_name like '%D%'
where user_name like 'D%D'
where to_char(字段)='k'
where nvl(字段,'0')='3'
where to_date(字段)
......
--以上排除建了函数索引的情况,如果想用索引则建立函数索引.提高执行速度:
1.尽量少在条件中用to_number,to_date等的计算,
2.尽量少用复杂的表达式.
3.尽量少用where id=nvl(:id,id)
4.字段变长时用where user_name ='name',定长时用where user_name like 'name'
.....
--索引对插入和更新的速度将会有一定的影响同一查询出现快慢的另一原因可能是:该语句第一次查询的时候慢,而后如果不修改该语句,系统将把分析优化后的sql停留在SGA区,下次执行相同的语句的时候,系统将不再分析优化,直接执行现有的语句,这样就会快很多.
把你的该查询的表结构,数据量和SQL语句列出来。
第二,
用SQL_plus执行该SQL语句,并列出执行计划。
第三,
只有以上的条件都给充足,我们才可能真正知道你病在哪里!
当然sql滞留sga区确实可以提升速度,但是不明显。因为它提升的无非就是避免了再一次sql的验错、编译对我们来说意义通常不是那么大。
1、data buffer 存放数据,如果设置不好,常用的数据经常被挤出去,造成查询时访问硬盘,从而降低性能;
2、shared pool也是这样,看看是否存在大量的硬解析呢?
结论:
呵呵,楼主,你去这里,研究研究statspack吧~
Statspack专题
http://www.eygle.com
1、重新分析表。
2、将chained row重新整理
3、大表进行分区
4、如果客户允许的话,先exp出来再imp进去就可以解决很多事。
具体你可以根据执行时间和执行计划来判断该语句的运行情况,有的DBA在工作中发现有很多查询要经常用.他会手动的把改查询正常驻留,以提升系统性能.(以上个人观点)