《SQL编写标准(数据库操作规范)》旨在提供一套统一且高效的SQL语句书写规则,以确保数据库操作的安全性、一致性和可维护性,适用于各类数据库管理系统。
8. 使用执行计划分析SQL性能
EXPLAIN PLAN是用于分析SQL语句的优秀工具,它可以在不实际执行的情况下评估这些语句的效果。
通过该工具可以了解Oracle数据库是如何连接表、使用何种方式扫描(索引或全表)以及使用的具体索引名称等信息。解读结果时应遵循从内到外和自上而下的原则,并注意操作顺序的排列,最内部的操作最先被解释;同一层级中,编号较小者优先执行。
目前市面上有许多第三方工具如PLSQL Developer 和 TOAD 等都提供了便捷的EXPLAIN PLAN功能以帮助开发者优化查询性能。对于PostgreSQL来说,则需要将自定义的查询语句记录到日志文件,并通过 EXPLAIN ANALYZE 来分析,尽量避免全表扫描的情况发生。
ORACLE SQL 性能优化指南
1. 选择最高效的表名顺序(仅在基于规则的优化器中有效)
Oracle解析器按照从右至左处理FROM子句中的表名。因此,在包含多个表的情况下应以记录数最少者作为基础表,即FROM子句最后的那个。
当需要连接多张表时,系统会采用排序和合并的方式进行操作:首先扫描第一个(FROM中最后一个)并对其进行排序;接着是第二个(倒数第二),以此类推直至所有表格处理完毕。例如:
- 表TAB1 有16,384条记录
- 表TAB2 只有5条记录
选择TAB2作为基础表会更高效,执行时间仅为0.96秒;而将TAB1设为基础表则需要消耗更多的时间(约26.09秒)。
如果有三个或更多的表格连接查询,则应该选取一个被其他所有表格引用的交叉表作为基准。比如:
EMP 表描述了 LOCATION 和 CATEGORY 的交集
SELECT * FROM LOCATION L, CATEGORY C, EMP E WHERE E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN
比下面这个语句更有效率:
SELECT * FROM EMP E , LOCATION L , CATEGORY C WHERE E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN AND E.EMPNO BETWEEN 1000 AND 2000
2. 在WHERE子句中优化连接顺序
Oracle按照自下而上的方式解析WHERE条件,因此表之间的连接操作应当放在其他过滤条件之前。同时,应该将能筛选出最多记录的条件置于最后。
例如:
低效查询(耗时156.3秒)
SELECT * FROM EMP E WHERE SAL > 50,000 AND JOB = MANAGER AND (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) > 25
高效版本(仅需10.6秒)
SELECT * FROM EMP E WHERE (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) > 25 AND SAL > 50,000 AND JOB = MANAGER
3. 避免使用*在SELECT子句中
当你想列出所有列时,虽然可以方便地用星号代替全部字段名,但这实际上是效率较低的做法。因为Oracle需要先查询数据字典将所有的字段名称具体化出来。
4. 减少访问数据库的次数