Oracle的Outline技术可以在特殊情况下保证执行计划的稳定性,将执行计划写死。在极端情况下可以使用这个技术实现暂时锁定执行计划的目的。
主要使用场景如下:
短时间内无法完成SQL的优化任务,此时可以使用outline暂时锁定SQL执行计划;
在CBO优化模式下,当统计信息出现问题时,会导致执行计划出现异常变化,此时可以使用outline暂时调整SQL执行计划;
由于数据库的bug导致SQL的执行计划出现异常,使用outline锁定执行计划。
不改变源代码的情况下,修改执行计划(通过增加提示)。
记录一下关于outline的使用方法,供参考。
1.环境准备
1)创建用户secooler,并授予适当权限,注意,用户需要具有create any outline权限
sys@ora10g> create user secooler identified by secooler default tablespace TBS_SECOOLER_D;
User created.
sys@ora10g> grant connect,resource to secooler;
Grant succeeded.
sys@ora10g> grant create any outline to secooler;
Grant succeeded.
2)在secooler用户中创建表T
secooler@ora10g> create table t as select * from all_objects;
Table created.
secooler@ora10g> select count(*) from t;
COUNT(*)
----------
4548
2.创建outline
1)解锁outln用户
sys@asd> alter user outln identified by outln account unlock;
User altered.
2)创建一个outline,取名叫做t_outln1,指定它的category名字为CATEGORY_T
outln@ora10g> conn secooler/secooler
Connected.
secooler@ora10g> create outline t_outln1 for category CATEGORY_T on select * from t where OBJECT_ID=258;
Outline created.
3)此时outln用户下的三张表OL$、OL$HINTS和OL$NODES中便会记录与此次操作的相关信息。执行计划会记录在OL$HINTS中。
secooler@ora10g> conn outln/outln
Connected.
outln@ora10g> select hint_text from ol$hints where ol_name = 'T_OUTLN1' order by hint#;
HINT_TEXT
--------------------------------------------------
FULL(@"SEL$1" "T"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
IGNORE_OPTIM_EMBEDDED_HINTS
4)比对一下对应的执行计划
outln@ora10g> conn secooler/secooler
Connected.
secooler@ora10g> set autotrace traceonly explain;
secooler@ora10g> select * from t where OBJECT_ID=258;
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 256 | 36 (3)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 2 | 256 | 36 (3)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=258)
Note
-----
- dynamic sampling used for this statement
这里记录了一个全表扫描的的执行计划。
5)关于创建的outline基本信息也可以通过dba_outlines视图进行查询
secooler@ora10g> select NAME,OWNER,CATEGORY,SQL_TEXT from dba_outlines;
NAME OWNER CATEGORY
------------------------------ ------------- -------------------
SQL_TEXT
----------------------------------------------------------------
T_OUTLN1 SECOOLER CATEGORY_T
select * from t where OBJECT_ID=258
3.使用outline
1)为了对比,我们创建索引,改变SQL语句的执行计划
(1)在T表的X字段创建索引
secooler@ora10g> create index i_t on t(object_id);
Index created.
(2)查看此时SQL的执行计划
secooler@ora10g> set autotrace traceonly explain;
secooler@ora10g> select * from t where OBJECT_ID=258;
Execution Plan
----------------------------------------------------------
Plan hash value: 2928007915
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 128 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 128 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | I_T | 1 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=258)
Note
-----
- dynamic sampling used for this statement
从执行计划上可以看到此时该SQL使用到了索引,没有进行全表扫面。
2)强制SQL使用ontline中记录的执行计划
(1)设置系统使用category为CATEGORY_T的outline
secooler@ora10g> alter system set use_stored_outlines=CATEGORY_T;
System altered.
(2)再次查看SQL语句的执行计划
secooler@ora10g> select * from t where OBJECT_ID=258;
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 124 | 15872 | 36 (3)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 124 | 15872 | 36 (3)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=258)
Note
-----
- outline "T_OUTLN1" used for this statement
从最后的注释上我们已经可以看到,此时SQL语句执行过程中使用的是outln中记录的执行计划。SQL在获取数据的时候走的是全表扫描。
3)消除ontline对SQL语句的影响
(1)第一种方法是调整use_stored_outlines参数为false
secooler@ora10g> alter system set use_stored_outlines=false;
System altered.
secooler@ora10g> select * from t where OBJECT_ID=258;
Execution Plan
----------------------------------------------------------
Plan hash value: 2928007915
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 128 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 128 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | I_T | 1 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=258)
Note
-----
- dynamic sampling used for this statement
(2)第二种方法是停用具体的outline
这种方法可以在use_stored_outlines参数起作用的前提下停用具体的outline。
secooler@ora10g> alter system set use_stored_outlines=CATEGORY_T;
System altered.
secooler@ora10g> select * from t where OBJECT_ID=258;
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 124 | 15872 | 36 (3)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 124 | 15872 | 36 (3)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=258)
Note
-----
- outline "T_OUTLN1" used for this statement
secooler@ora10g> alter outline t_outln1 disable;
Outline altered.
secooler@ora10g> select * from t where OBJECT_ID=258;
Execution Plan
--------------------------------------------------
Plan hash value: 2928007915
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 128 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 128 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | I_T | 1 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=258)
Note
-----
- dynamic sampling used for this statement
此时ontline T_OUTLN1已经被停用。
4.更换大纲名字,从而不改变源代码的情况下,修改执行计划(通过增加提示)
outln@ora10g>select * from ol$hints;
outln@ora10g>update ol$hints set ol_name=decode(ol_name,'OL','OL2','OL2','OL')
where ol_name in('OL','Ol2');
5.清除outline
我们在10g环境下可以使用dbms_outln.drop_by_cat完成清空具体category的目的。
secooler@ora10g> conn outln/outln
Connected.
outln@ora10g> select hint_text from ol$hints where ol_name = 'T_OUTLN1' order by hint#;
HINT_TEXT
--------------------------------------------------
FULL(@"SEL$1" "T"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
IGNORE_OPTIM_EMBEDDED_HINTS
outln@ora10g> exec dbms_outln.drop_by_cat('CATEGORY_T');
PL/SQL procedure successfully completed.
outln@ora10g> select hint_text from ol$hints where ol_name = 'T_OUTLN1' order by hint#;
no rows selected
6.关于USE_STORED_OUTLINES参数的说明
USE_STORED_OUTLINES参数不像一般的参数可以在参数文件中进行设定,但我们可以使用常规的方法对其进行修改。
ALTER SESSION SET USE_STORED_OUTLINES = TRUE | FALSE | category;
ALTER SYSTEM SET USE_STORED_OUTLINES = TRUE | FALSE | category;
7.小结
通过文中的描述,大家应该对Oracle Outline技术有一个比较详细的了解。在CBO优化模式下,很有可能遇到执行计划不稳定及不准确的情况。在这种场景下我们可以考虑使用这项技术暂时规避执行计划变化带来的性能问题。
===========================================================================================
SQL outline的创建与迁移(从一个库移植到另一个库):
http://www.docin.com/p-86872586.html
分享到:
相关推荐
### Oracle SQL 优化与调优技术详解:深入理解SQL提示 #### 一、SQL提示的定义及作用 在Oracle数据库的SQL语句中,SQL提示(Hints)是一种用于指导优化器选择特定执行计划的特殊注释语法。这些提示能够帮助数据库...
1. **表连接方式**:Oracle支持多种表连接方式,包括哈希连接(Hash Join)、合并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。每种连接方式都有其适用场景,比如...
### ORACLE_高效SQL分析 #### 一、SQL优化基础 **Oracle内存空间** Oracle数据库在运行时会利用大量的内存来提高数据访问速度。这部分内存主要由两大部分组成:SGA(System Global Area)和PGA(Program Global Area...
5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.... 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0....CSDN老板不让我上传联系方式。
根据提供的文档内容,本文将重点围绕“Oracle高效SQL分析”的核心知识点进行展开,具体包括SQL执行过程、数据读取方式、表连接实现方式以及如何通过提示和OutLine来调整和固定执行计划等内容。 ### Oracle高效SQL...
本项目是针对 PDF.js 的一个定制化实现,专注于展示文档的目录大纲(outline)功能。 在 PDF 文件中,目录大纲通常包含文档的主要部分和子部分,允许读者快速导航至特定章节。在 PDF.js 的默认示例 "simpleviewer" ...
EP Outline 是一款旨在简化游戏开发过程中轮廓和高光效果创建的 Unity 插件。该插件能够快速提升游戏的视觉效果,无论是简单还是复杂的模型,都可以通过调整参数和设置来实现个性化的轮廓效果。开发者鼓励用户在社交...
课程安排方面,首先会介绍显示技术的大纲,包括对各种显示技术的基本定义和概述。接下来,会深入探讨光度学和色度学,这是理解和评价显示设备性能的基础。然后,会详细讲解电视图像传输的原理,这对于理解视频显示...
- **内容**:学习使用 SQL Profile 和 SQL Outline 等高级工具;探讨如何手动调整执行计划;介绍使用 SQL Access Advisor 来获取性能建议的方法。 ##### 4. 使用文档注意事项 - **版权信息**:文档受到版权保护,...
freetype-direct-gl:OpenGL文本渲染库:使用freetype outline进行GPU赋能的文本渲染
最后,在应用阶段,SQL Optimizer在特定情况下可以自动将最优方案应用到原始代码,包括Send Back(直接返回)、Generate Script(生成脚本)以及结合Oracle Outline。无论代码是否可修改,都能通过SQL Optimizer将...
- KNOWLEDGE EXPERT™ FOR ORACLE ADMINISTRATION:Oracle管理知识专家,提供Oracle管理方面的专业帮助。 - DATA FACTORY™ DEVELOPER EDITION:数据工厂开发版,提供测试数据生成工具。 - BENCHMARK FACTORY™ ...
- **Outline Manager**:大纲管理器,用于管理SQL执行计划。 - **Plan Change Analyzer**:计划变更分析器,用于分析SQL执行计划的变化。 - **Best Practices**:最佳实践,提供基于规则的数据库设计和编码推荐。...
在Cadence Allegro 17.2版本中,设计者们遇到了一个显著的变化,那就是设计大纲(Design Outline)的使用方式。以往版本中,设计师通常使用Outline层来定义电路板的外观,但在17.2版中,Cadence推荐使用Design ...
在CSS中,轮廓(outline)是一种非几何的装饰性元素,用于强调或区分网页上的某个特定元素。与边框(border)不同,轮廓并不占据任何空间,它位于边框之外,不影响元素的尺寸。轮廓主要通过`outline`属性来设置,...
### 数据库课件总结:Database Chapter Three Outline #### SQL与数据定义语言(Data Definition Language, DDL) 在数据库管理领域,SQL(Structured Query Language)是一种非常重要的编程语言,被广泛应用于...
### 数据库课件总结:Database Chapter Four Outline #### 第四章:高级SQL 在本章节中,我们将深入了解SQL数据类型、模式(schemas)、域约束、大型对象类型、单表约束、断言、授权以及触发器等内容。这些概念是...
使用将描边的svg为概述版本的公共端点终点POST 参量input [必需] svg描边的代码以转换轮廓...rest? [可选参数]参见例子使用对svg代码进行url-encode ,但是如果使用例如则可以传递常规的svg代码curl -d " input=<...