目录
1.前言
一般而言,数据库查询慢首先是查看sql写法有无问题,然后分析查询的时候是否充分运用到索引。常规的sql优化也就是这样一个大体的流程;
但是,有意外情况,就是一条老的sql,一直用的没问题,偶然出现了查询慢的情况,曾在Oracle数据库上遇到过这个问题,以下对这次情况做一个回顾。
2.一条老sql突然查询慢了
首先sql写法没变;
其次,检查索引列是正常;
咨询了数据库的操作,是在环境数据同步后发生的,由于数据同步涉及了大量的并行查询,可能与这有关。
3.修复
a. 查询并行度:
select degree from dba_indexes where index_name='index_name';
查询的值DEGREE较高。
b. 关闭并行查询
sql> alter index index_name(索引名称) noparallel;
之后查询并行度,degree的值为1;
老的sql查询也变快了,数据库性能恢复。
4.原因分析
建索引时,我们为了建索引快,会加上并行,加上并行之后,此列索引就会是并行了。访问有并行度的索引时,可能会出现并行执行,这可能会引发一些问题,如在服务器资源紧张的时候用并行会引起更加严重的争用。当使用并行后,需要把并行度改回来。分区建立后发现查询SQL未走索引,发现索引失效,需要重建;由于表太大重建索引时给索引加上了并行(深度degree),但是未在结束后加上noparallel。
附:并行度的查询sql
SQL> select degree from dba_indexes where index_name='index_name';