1. 什么是执行计划
在对Oracle数据库进行查询优化时,查询执行计划是一种非常重要的工具。执行计划是指Oracle数据库在执行SQL语句时,所采用的具体执行方式。它由Oracle数据库自行生成,是数据库优化的重要参考依据。
1.1 执行计划的作用
执行计划可以展示出Oracle在执行SQL语句时所使用的具体查询路径,包含了哪些操作符以及这些操作符的执行先后顺序,对查询优化非常重要。
1.2 执行计划中的重要参数
在执行计划中,有几个重要的参数需要注意:
Rows:指返回的行数
Cost:指此SQL语句执行所消耗的资源成本,成本越低SQL语句执行速度越快
Operation:指操作符,如Table Access Full、Index Unique Scan等等。
Cardinality:指行的数量估计值,它与Rows有关,但Cardinality是在执行计划生成前进行优化时的一个预估值,而Rows是真正的返回值。
2. 查看执行计划的方法
Oracle提供了多种方式查看执行计划,以下是其中的常用方法:
2.1 使用EXPLAIN PLAN命令
在Oracle中可以使用EXPLAIN PLAN命令来生成SQL语句的执行计划:
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE salary > 6000;
执行完成后,可以使用以下命令来查看执行计划:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
执行结果如下图所示:
2.2 使用AUTOTRACE命令
AUTOTRACE是Oracle提供的另一种查看执行计划的方式。使用AUTOTRACE需要在SQL*Plus中执行SQL语句:
SET AUTOTRACE ON;
SELECT * FROM employees WHERE salary > 6000;
SET AUTOTRACE OFF;
执行完成后,可以看到类似以下的输出结果:
Execution Plan
----------------------------------------------------------
Plan hash value: 1545031912
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1029 | 54627 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES| 1029 | 54627 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
4 consistent gets
1 physical reads
0 redo size
1682 bytes sent via SQL*Net to client
592 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
9 rows processed
AUTOTRACE的执行计划与EXPLAIN PLAN有些许不同,但主要内容是相同的。
2.3 使用SQL Developer工具查看
在Oracle SQL Developer工具中,可以通过以下几个步骤查看执行计划:
在SQL编辑器中输入要执行的SQL语句
点击工具栏中的绿色三角形运行按钮
在SQL执行结果的下方展示面板中,点击“Execution Plan”选项卡
如下图所示:
3. 如何优化SQL查询
通过查看执行计划,我们可以了解SQL查询在执行过程中的具体情况,然后根据执行计划对查询进行优化,以获得更好的查询性能。以下提供一些常用的查询优化方法:
3.1 索引优化
在SQL查询中常用的索引包括B-tree索引、位图索引、哈希索引等。通过创建索引来加快查询速度,但同时也可能影响INSERT/UPDATE/DELETE等操作的性能。
一些常用的索引优化方法:
针对SQL查询的性质对表进行分区,采用不同的索引类型
禁用无用的索引
优化索引的列选择以及列顺序
3.2 SQL语句优化
在SQL查询中,一些简单的优化方法可以大大提升查询速度:
使用与操作无关的操作符(如!=代替<>)
使用子查询代替JOIN语句
使用连接代替子查询
使用单引号或者双引号
避免在WHERE语句中使用函数
3.3 表结构优化
在表结构设计中,也有一些优化方法可以提高查询速度:
避免使用大型文本字段(如BLOB/CLOB)
选择正确的存储方式(如RAW/BLOB)
避免使用过多的空值
把数据类型尽量选择得小一点
总结
在开发Oracle数据库的时候,可以通过观察SQL语句的执行计划,根据执行计划对SQL语句进行优化,达到更好的查询性能。通过调整索引、优化SQL语句、优化表结构等手段,可以使得查询速度更快。