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 中如何将一张500万数据的表从一个库快速转移到另外一个库
如何从一个DataTable中复制数据行到另一个DataTable中