DBA的日常核心工作之一是对线上有性能问题的SQL语句进行优化。其中优化SQL语句的最关键的一步是得到SQL的执行计划。那么一个常见的问题来了。如何得到一个SQL语句的真实执行计划?方法有很多。今天说其中一种方法就是使用 gather_plan_statistics(收集计划统计信息)
首先简单说一下oracle sql语句的生成执行计划的过程。当运行 SQL 查询时,数据库将首先解析它并为传入的查询生成 AST(抽象语法树)。解析器验证 SQL 语句的语法并检查查询的对象是否存在等。解析器可以重写查询以优化其执行,而不影响最终的结果。生成的查询树被发送到优化器,优化器需要找出获取当前 SQL 查询所需数据的最佳方式。这个时候。优化器生成了一个执行计划,它是满足 SQL 查询要求所需执行的操作列表。生成的执行计划被发送到执行器,执行器运行它并将获取的数据发送回数据库客户端。
SQL 处理和执行步骤如下图:
评估的执行计划由优化器生成,并没有真正的执行 SQL语句。可以用EXPLAIN PLAN FOR SELECT ..... 这样子生成评估的执行计划。然后数据库会将估计的执行计划存储在关联的 PLAN_TABLE里:
SQL> EXPLAIN PLAN FOR SELECT COUNT(*) FROM T01;
Explained.
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));
PLAN_TABLE_OUTPUT
--------------------------------------------------