【问题标题】:DBMS_XPLAN.DISPLAY_CURSOR vs Explain Plan if not using gather_plan_statistics hintDBMS_XPLAN.DISPLAY_CURSOR vs Explain Plan 如果不使用gather_plan_statistics 提示
【发布时间】:2012-03-12 10:17:57
【问题描述】:

只是要求澄清两者之间的区别。据我了解,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 被填充,它只会给你执行计划而不是实际的执行统计信息。它仅适用于填充 V$SQL_PLAN_STATISTICS 的/*+ gather_plan_statistics */

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

【问题讨论】:

    标签: sql performance oracle oracle11g sql-execution-plan


    【解决方案1】:

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

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

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

    在会话中你可以运行

    select * from dual;
    select * from table(dbms_xplan.display_cursor);
    

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

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

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

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

    我希望这会有所帮助。

    【讨论】:

    • 嗯,但如果你不使用 /*+ collect_plan_statistics */ 那么它不会收集语句的实际运行时统计信息,对吗?它只会显示估计的基数; IE。如果您没有使用提示,则调用时不会得到“A-ROWS”列:dbms_xplan.display_cursor(format=>'allstats')
    • 随着提示你得到另一个 sql_id。您可以通过在应用程序会话中(或在应用程序运行时的实例级别)设置 statistics_level = 'ALL' 来启用此统计信息收集。它只能用于故障排除;与“典型”相比,它引入了额外的开销。
    猜你喜欢
    • 2013-07-13
    • 2012-08-13
    • 2018-04-30
    • 2012-05-04
    • 1970-01-01
    • 2013-01-01
    • 2011-12-30
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多