DBMS_XPLAN.DISPLAY_CURSOR vs解释计划,如果不使用gather_plan_statistics提示

BYS*_*YS2 8 sql oracle performance oracle11g sql-execution-plan

只是要求对2.之间的区别进行澄清2.据我所知,EXPLAIN PLAN为您提供理论执行计划,而DBMS_XPLAN.DISPLAY_CURSOR为您提供了具有该语句执行统计信息的实际执行计划.

EXPLAIN PLAN将此数据存储在PLAN_TABLE中,而DBMS_XPLAN使用V $ SQL_PLAN,V $ SQL_PLAN_STATISTICS和V $ SQL_PLAN_STATISTICS_ALL视图获取其信息.

但是,要使DISPLAY_CURSOR收集该参数的实际运行时统计信息,需要设置/*+ gather_plan_statistics */提示.否则,只填充V $ SQL_PLAN,它只会为您提供执行计划,但不会为您提供实际的执行统计信息.只有/*+ gather_plan_statistics */在填充V $ SQL_PLAN_STATISTICS 的地方.

所以我的问题是,如果我不使用gather_plan_statistics提示,EXPLAIN PLAN和DISPLAY_CURSOR会不会给我相同的执行计划(对于同一个语句)?

ik_*_*elf 6

差异不是很微妙,它们是巨大的.

正如您正确提到的,解释计划将其数据存储在plan_table中,并从该表中查询计划.这意味着不执行sql,只要求优化器提供计划.在该设置中,计划在很大程度上取决于运行解释计划的会话的优化程序环境.

使用DBMS_XPLAN.DISPLAY_CURSOR,您可以获得之前执行过的计划.通过发出DBMS_XPLAN.DISPLAY_CURSOR不存储该计划; 它存储在v $结构中,因为它已被执行.

在会话中,您可以运行

select * from dual;
select * from table(dbms_xplan.display_cursor);
Run Code Online (Sandbox Code Playgroud)

查询在'select from dual'中执行,这也导致创建计划并存储在v $结构中.display_cursor只查找最后执行的游标并显示它遵循的计划.使用此设置/*+ gather_plan_statistics*/没有附加值,因为计划及其统计信息已存在于shared_pool中.

您的另一个问题是,计划是否始终相同取决于许多因素.变量是否相同?,您使用自适应游标共享,是否使用SQL计划稳定性...

你的问题:给出解释计划和display_cursor相同的计划吗?我不会依赖它,因为有了解释计划,该计划取决于您的会话优化器环境.display_cursor是更好的方法,最好使用由应用程序创建的命名游标.如果不使用SQL计划稳定性,则计划可以在优化程序统计信息更改时更改.如果使用自适应游标共享,则计划可在变量更改时更改.

关于采样开销的一些很好的阅读可以在Jonathan Lewis博客上找到.同样来自Jonathan:gather_plan_statistics我通常更聪明地使用statistics_level设置'all'进行调试,而不是使用/*+ gather_plan_statistics*/hint.提示更改代码并导致新的sql_id.

我希望这有帮助.