1. 什么是执行计划
在 Oracle 数据库中,执行一个查询语句需要经过以下几个步骤:
语法解析
查询优化
执行计划生成
执行计划执行
其中,查询优化的过程是决定查询性能的关键因素之一,而生成和执行执行计划则是查询优化的重要环节之一。执行计划是指 Oracle 数据库在执行查询语句时,为了最有效地执行查询而生成的一份详细的计划书。
1.1 执行计划的作用
执行计划的主要作用是用来调试和优化查询语句。它可以帮助我们深入了解查询语句的具体执行过程,比如它将使用哪些索引、哪些表连接方式等等。执行计划可以通过 EXPLAIN PLAN
语句来查看。
2. EXPLAIN PLAN 语句
要查看一个查询语句的执行计划,需要使用 EXPLAIN PLAN
语句。
下面是一个简单的例子:
EXPLAIN PLAN FOR
SELECT * FROM employee WHERE salary > 5000;
执行查询后,我们可以使用 SELECT
语句从 PLAN_TABLE
中查询生成的执行计划:
SELECT * FROM PLAN_TABLE;
需要注意的是,每次执行查询语句时,都会生成一份新的执行计划。所以在查看执行计划前,最好先保证这个查询语句的执行环境是符合实际情况的。
3. 执行计划解读
下面是一个示例的执行计划:
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 36 | 2 (0)| 00:00:01 |
| * 1 | TABLE ACCESS BY INDEX ROWID | EMPLOYEE | 1 | 36 | 2 (0)| 00:00:01 |
| * 2 | INDEX RANGE SCAN | EMP_SAL_IDX | 2 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("SALARY">5000)
2 - access("SALARY">5000)
执行计划中,每一行表示一步操作,其中包括以下信息:
Id:代表这一步操作的序号。序号越小,执行时间越早。
Operation:代表这一步操作的类型。比如上面的例子中,第一步操作是 SELECT STATEMENT
。
Name:代表这一步操作需要对应的表或索引。比如上面的例子中,第二步操作需要对应名为 EMPLOYEE
的表。
Rows:代表这一步操作后返回的行数。
Bytes:代表这一步操作后返回的字节数。
Cost:代表这一步操作的执行代价。代价越小,执行时间越短。
Time:代表这一步操作的预计执行时间。
3.1 执行计划操作类型
在执行计划中,操作类型代表了每一步操作的性质,它可以分为以下一些类型:
FULL TABLE SCAN:全表扫描。
INDEX UNIQUE SCAN:索引唯一扫描,用于查询某个唯一值。
INDEX RANGE SCAN:范围扫描索引,查询指定范围内的记录。
INDEX FULL SCAN:全索引扫描。
SORT ORDER BY:排序。
NESTED LOOPS:嵌套循环。
HASH JOIN:哈希连接。
MERGE JOIN:归并连接。
UNION-ALL:多表数据合并,不去重。
UNION:多表数据合并,去重。
GROUP BY:分组。
SELECT:查询。
3.2 执行计划操作顺序
在执行计划中,操作的顺序是自上而下的,也就是说执行顺序是从上至下。我们可以通过这个顺序来判断每一步操作是否被优化和最优。
需要注意的是,执行计划的顺序只是一个计划,实际执行时可能会有变化,原因可能是数据分布不均、硬件性能、并发度等等原因。
3.3 执行计划关键字
在执行计划最后的部分,会有一个叫做 Predicate Information 的部分,其中会列出下面这几个关键字:
access:代表这一步操作所使用的索引或表。
filter:代表这一步操作中对数据的过滤条件。
使用这两个关键字可以更好地理解和理解执行计划。
4. 执行计划优化
在 Oracle 数据库中,执行计划的优化是查询优化的一个关键环节。以下是一些常用的执行计划优化技巧:
4.1 使用索引
索引是查询优化中的重要工具之一。在优化执行计划时,应该考虑是否可以使用索引来提高查询性能。
4.2 避免全表扫描
全表扫描是一种比较慢的操作,应该尽量避免使用。
4.3 减少数据访问次数
每次数据访问都会带来一定的开销,因此应该尽可能减少数据访问次数。比如可以使用 SELECT * FROM
的方式来查询需要的字段,而非从表中查询所有字段。
4.4 约束优化
Oracle 数据库支持约束,包括主键、唯一、检查和外键等。约束可以给表添加一些限制条件,从而提高数据完整性。
4.5 嵌套循环优化
嵌套循环是一种比较慢的操作,应该尽量避免使用。当必须使用嵌套循环时,应该尽可能缩小循环范围。
5. 总结
执行计划是查询优化中的一个重要环节。通过查看执行计划,我们可以深入了解查询语句的具体执行过程,进而进行优化。
在实际应用中,我们可以通过合理使用索引、避免全表扫描、减少数据访问次数、约束优化和嵌套循环优化等方式来优化执行计划,从而提高查询性能,减少数据库响应时间。