Oracle的SQL性能优化 (四)基础优化方法
数据库的优化
一般情况下,按照业务逻辑设计的数据库结构能够满足性能的需求,除非设计者没有足够的经验和技术。如果还存在性能问题,可以通过如下方式进行优化:
加上必要的索引,例如经常查询的字段,外键字段或关联字段
加一些冗余字段,有两种用法。一是可以对本表的数据进行细分,可以提高索引的性能,例如员工表中可以加入是否在职字段,和部门字段组成一个索引。二是避免对子表的读取,例如在员工表特别大的情况下可以在部门表中加入部门员工数字段,从而避免在统计部门员工时读取员工表。
采用分区表,或者将历史数据迁移到历史表中。
表的统计信息包括行数、字段数、每个字段的值的分布情况等,它对优化也是有影响的。一般来说DBA会制定计划更新统计信息,程序开发过程中一般不需要特别关注它,仅当数据分布不好时才需要认真考虑。
SQL语句的优化
SQL由业务决定,模式千变万化,但一些基本原则如果得到遵守,性能可以得到提高,而且便于后面的优化
在表关联时,主要的业务表应该在优先关联,父表应该在前面,并且按照业务逻辑对表逐个进行关联
用With可以简化SQL语句,有时也能提高性能
用比较简单明了、风格统一的方式写SQL
充分利用Oracle提供的函数,尤其是统计函数、递归函数等,能极大改善SQL的结构和性能。例如统计部门的员工人数,采用如下模式容易理解,也更容易调优。因为当选择字段多的情况下,GROUPBY太难以使用。
SELECT DISTINCT
dept.dept_id,
dept.dept_name,
COUNT (emp.emp_id) OVER (PARTITION BY emp.dept_id)
FROM dept, emp
WHERE dept.dept_id = emp.dept_id
再例如部门有上下级关系时,显示一个部门的全路径用函数wmsys.wm_concat比自己写递归SQL要快得多。