Oracle数据库查询慢可能由多种原因导致,以下是常见原因及解决办法:
常见原因- 索引问题:没有索引或者没有用到索引,这是查询慢最常见的问题,属于程序设计的缺陷。
- I/O瓶颈:I/O吞吐量小,形成了瓶颈效应。
- 计算列缺失:没有创建计算列导致查询不优化。
- 内存不足:服务器内存不足影响查询性能。
- 网络问题:网络速度慢,影响数据传输。
- 数据量过大:查询出的数据量过大,增加了处理和传输的负担。
- 锁问题:锁或者死锁,也是常见问题,属于程序设计缺陷。
- 资源竞争:读写竞争资源,如sp_lock,sp_who活动的用户查看。
- 多余行列:返回了不必要的行和列。
- 查询语句不佳:查询语句没有优化。
解决办法- I/O优化:把数据、日志、索引放到不同的I/O设备上,增加读取速度;纵向、横向分割表,减少表的尺寸。
- 硬件升级:升级硬件,如增加服务器CPU个数、扩大服务器的内存。
- 索引优化:根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量;注意填充因子要适当,使用字节数小的列建索引。
- 网络优化:提高网速。
- 内存配置:扩大服务器的内存,合理配置虚拟内存。
- 查询语句优化:在查询Select语句中用Where字句限制返回的行数,避免表扫描;尽可能不使用光标;用Profiler来跟踪查询,找出SQL的问题所在;注意UNion和UNion all的区别,避免不必要的DISTINCT和ORDER BY;使用显示申明指定索引等。
- 其他优化:将需要查询的结果预先计算好放在表中;使用存储过程,减少网络开销;少用临时表,尽量用结果集和Table类型的变量代替。
此外,如果是用Qt访问Oracle数据库,执行query.next函数速度慢,可调用QSqlDatabase::setConnectionOptions函数设置数据预读行数,如“OCI_ATTR_PREFETCH_ROWS=100”。