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

Posted

技术标签:

【中文标题】Oracle 将执行计划从一个数据库复制到另一个【英文标题】:Oracle Copy Execution Plan from One Database to Other 【发布时间】:2019-07-18 14:14:43 【问题描述】:

我有两个相同的数据库。

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

在数据库 2 上 - 执行计划大不相同,查询需要很长时间。

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

【问题讨论】:

你不能。某些关键索引、收集的统计信息中可能缺少数据库 2,或者可能具有不同的设置。您应该提供两个数据库的执行计划,以便我们进行比较。 【参考方案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;

提示是尽可能遵守的指令。如果其中一个依赖对象(如索引)不可用,则可能不遵守提示。

像这样强制执行计划可能是解决性能问题的一种快速方法,但它并不能解决根本原因。通常最好弄清楚为什么两个数据库会生成不同的计划。但这是一个更难解决的问题。

【讨论】:

似乎这就是我在数据库 1 中强制执行计划的方式。如何将此执行计划复制到数据库 2? @oradbanj 你能修改数据库 2 中的 SQL 以包含提示吗?如果没有,应该有一种方法可以使用 Oracle 配置文件复制执行计划。如有必要,我可以稍后添加示例。

以上是关于Oracle 将执行计划从一个数据库复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

按计划将SQL Server数据从一台服务器复制到另一台服务器

Oracle - 将日期从一列复制到另一列的更新语句

oracle 中如何将一张500万数据的表从一个库快速转移到另外一个库

如何从一个DataTable中复制数据行到另一个DataTable中

将 SQL Server Express 数据库复制到另一台计算机

oracle 将一张表的数据插入到另一张表