从一个数据库到另一个数据库的Oracle复制执行计划

时间:2019-07-18 14:14:43

标签: oracle database-performance query-performance

我有两个相同的数据库。

在数据库1上,查询几乎立即给出响应。

在数据库2上-执行计划有很大不同,查询需要花费很多时间。

如何从数据库1复制执行计划,并强制数据库2上的优化器使用该查询计划?

1 个答案:

答案 0 :(得分:1)

复制执行计划的最快方法是使用提示大纲。

首先,找到或生成执行计划:

explain plan for select * from dual;

第二,使用+outline格式选项显示执行计划:

select * from table(dbms_xplan.display(format => '+outline'));

Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "DUAL"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION('12.2.0.1')
      OPTIMIZER_FEATURES_ENABLE('12.2.0.1')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

最后,使用整个提示在SQL语句的顶层,如下所示:

select
/*+
  BEGIN_OUTLINE_DATA
  FULL(@"SEL$1" "DUAL"@"SEL$1")
  OUTLINE_LEAF(@"SEL$1")
  ALL_ROWS
  DB_VERSION('12.2.0.1')
  OPTIMIZER_FEATURES_ENABLE('12.2.0.1')
  IGNORE_OPTIM_EMBEDDED_HINTS
  END_OUTLINE_DATA
*/
    *
from dual;

提示是在可能的情况下应遵循的指令。如果其中一个依赖对象(如索引)不可用,则可能无法遵守提示。

强制执行这样的执行计划可以快速解决性能问题,但不能解决根本原因。通常最好找出两个数据库为什么生成不同的计划。但这是一个更难解决的问题。