Oracle数据库性能优化与并行处理技术解析
1. Oracle索引选择机制
在Oracle数据库中,单个任务的最快执行方式并非总是最优选择。例如,对于员工表的如下查询:
select employee_name
from EMPLOYEE
where
credit_rating = 'poor'
and
amount_due > 1000
and
state = 'iowa'
and
job_description like lower('%computer%');
由于复杂的条件和SQL中使用的Oracle扩展,全表扫描可能是最有效的处理方法。不过,这种快速执行可能会以牺牲系统中其他任务为代价,因为缓冲池会被刷新。
一般来说,优化器的类型决定了索引的使用方式。Oracle优化器可以基于规则或基于成本运行。通常,若索引存在,Oracle会智能使用,但也有例外。最显著的例外是带有复杂 where
子句的n路连接,基于规则的优化器会混淆,即使所有表都有适当的外键索引,也会对至少一个表执行全表扫描。解决此问题的唯一方法是使用基于成本的优化器,这需要分析每个表的统计信息。
此外,Oracle仅在索引列以“纯”形式指定时才会使用索引。使用 substr
、 upper
、 lower
等函数会使索引失效。但有一些技巧可以绕过这个障碍,例如以下两个等效的SQL查询: