我有两个相同的数据库。
在数据库1上,查询几乎立即给出响应。
在数据库2上-执行计划有很大不同,查询需要花费很多时间。
如何从数据库1复制执行计划,并强制数据库2上的优化器使用该查询计划?
答案 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;
提示是在可能的情况下应遵循的指令。如果其中一个依赖对象(如索引)不可用,则可能无法遵守提示。
强制执行这样的执行计划可以快速解决性能问题,但不能解决根本原因。通常最好找出两个数据库为什么生成不同的计划。但这是一个更难解决的问题。