我们对 SQL 语句进行调优时,非常重要的一个方法就是分析 SQL 的执行计划。查看 Oracle 中 SQL 语句的执行计划有很多方法,例如通过 PL/SQL Developer 、 EM 或者 SQLPLUS 工具等。这里以 SQLPLUS 为例。
在 SQLPLUS 使用命令 SET AUTOTRACE ON 后,可以在查询结果后看到该语句的执行计划。也可以使用 SET AUTOTRACE TRACEONLY 命令,只返回执行计划而不返回查询结果。例如执行一个简单的全表扫描语句,返回执行计划如下:
从上述执行计划可以看到,对表的访问为全表扫描( TABLE ACCESS FULL )。这种情况一般是没有索引或者索引不可用。我们执行的 SQL 语句是 select * from hr.employees ,该语句没有指定搜索条件,所以也只能是全表扫描。
接下来我们还可以看到一些关于执行计划的统计信息。对于这些信息的分析非常重要。通过查询 Oracle 的文档,可以看到具体解释如下:
Recursive Calls:Number of recursive calls generated at both the user and system level.
Oracle Database maintains tables used for internal processing. When it needs to change these tables, Oracle Database generates an internal SQL statement, which in turn generates a recursive call.
In short, recursive calls are basically SQL performed on behalf of your SQL. So, if you had to parse the query, for example, you might have had to run some other queries to get data dictionary information. These would be recursive calls. Space management, security checks, calling PL/SQL from SQL—all incur recursive SQL calls.
…… …… 余下全文