网站首页 > 技术文章 正文
概述
在实际的工作当中,可能会碰到在开发环境或测试环境中系统运行正常,但是移植到真实生产环境中却发现响应速度很慢,如果在调试之后效果仍然不佳的情况下,可以尝试使用outlines来稳定个别SQL语句的执行计划。
概念
Oracle Outline,中文也称为存储大纲,是最早的基于提示来控制SQL执行计划的机制,也是9i以及之前版本唯一可以用来稳定和控制SQL执行计划的工具。
outline是一个hints(提示)的集合,更具体的讲,outline可以锁定一个给定SQL的执行计划,保持其执行计划稳定,不管数据库环境如何变更(如统计信息,部分参数等)
注意:
从10g以后,oracle连续发布了sql profile和sql baseline来实现SQL执行计划的控制,并且outline这个工具基本已经被Oracle废弃并且不在维护,但是不管怎么说,在10g以及11g版本都还是可以使用,而且这个特性也一直使用的很好。
10g以后建议使用sql profile或者sql baseline
由于目前outline现在已经很少使用,此文也就主要介绍一些命令。
Outlines存储在表OL$,OL$HINTS和OL$NODES,可通过视图[USER|ALL|DBA]_OUTLINES 和 [USER|ALL|DBA]_OUTLINE_HINTS查询已存在的outlines的信息。
运行机制
Outline将执行计划的hint集合保存在outline的表中(数据字典)。当执行SQL解析时,Oracle会与outline中的SQL比较,如果该SQL有保存的outline,则通过保存的hint集合生成指定执行计划。
注意:
SQL解析时,使用SQL文本却匹配数据字典outline保存的文本,此处匹配的方式为去掉SQL空格,忽略SQL大小写区别后,进行的比较。
例如,select * from dual 和SELECT * FROM dual这两个语句将使用同样的outline。
创建outlines
Outlines创建可分为oracle自动和手动,通过参数create_stored_outlines来控制,create_stored_outlines的值可以是true/flase/category_name,可在实例级和会话级别修改。
1、开启自动创建 outlines.
ALTER SYSTEM SET create_stored_outlines=TRUE; ALTER SESSION SET create_stored_outlines=TRUE;
2、关闭自动创建 outlines.
ALTER SYSTEM SET create_stored_outlines=FALSE; ALTER SESSION SET create_stored_outlines=FALSE;
3、授权
CONN sys/password AS SYSDBA GRANT CREATE ANY OUTLINE TO SCOTT; GRANT EXECUTE_CATALOG_ROLE TO SCOTT;
4、创建outlines
把条件写成变量,主要是因为在实际的运用过程中会绑定变量。
create table t_outline as select * from dba_objects; CREATE OUTLINE xx_id FOR CATEGORY xx_outlines ON select * from xx where id=:a;
5、检查outlines是否创建成功
SQL> select name,category,sql_text from user_outlines where category='T_OUTLINES';
6、列出和outlines有关的hints
SQL> select * from user_outline_hints where name='xx_ID';
使用outlines
现在我们已经创建好了outlines,但是从下面查询可以看出outlines并没有被使用。
1、检查outlines是否使用
select name,category,used from user_outlines where category='T_OUTLINES';
2、执行下面的SQL语句
SQL> VAR a number; SQL> DEFINE a = 32791; SQL> select * from t_outline where object_id=:a; no rows selected
3、再一次检查
SQL> select name,category,used from user_outlines where category='T_OUTLINES';
我们执行一遍SQL之后,outlines还是没使用,这是因为还没有启用。我们可以通过ALTER SYSTEM和ALTER SESSION命令去开启。下面将演示一下在会话级别启用outlines.
4、开启outlines
alter session set use_stored_outlines=t_outlines;
5、执行下面的SQL语句
SQL> VAR a number; SQL> DEFINE a = 20; SQL> select * from t_outline where object_id=:a;
6、检查
SQL> select name,category,used from user_outlines where category='T_OUTLINES';
删除和清除outlines
删除outlines
SQL>execute DBMS_OUTLN.drop_by_cat('T_OUTLINES');
清除制定outlines
SQL> execute DBMS_OUTLN.CLEAR_USED(' T_OUTLINES ');
删除所有状态为unused(dba(all,user)_outlines中可查)的outline
SQL> execute DBMS_OUTLN.drop_unused;
上面讲的主要是10g以前的,从Oracle 11g开始,提供了一种新的固定执行计划的方法,即SQL plan baseline,中文名SQL执行计划基线(简称基线),可以认为是OUTLINE(大纲)或者SQL PROFILE的改进版本,后面会总结下执行计划基线方面的内容,感兴趣的朋友可以关注一下~
猜你喜欢
- 2024-10-23 面试官:说说你对Oracle聚簇Cluster(B树聚簇)的一些看法?
- 2024-10-23 oracle数据库学习笔记 oracle数据库基础教程
- 2024-10-23 珍藏的ORACLE 体系结构详细图——逻辑结构+物理结构
- 2024-10-23 细说Oracle数据库与操作系统存储管理二三事
- 2024-10-23 【赵强老师】Oracle存储过程中的out参数
- 2024-10-23 oracle中怎么创建存储过程 oracle 创建存储过程,及调用
- 2024-10-23 从Oracle的SQL管理能力,看国产数据库差距
- 2024-10-23 Oracle存储过程模板 oracle存储过程视频教程
- 2024-10-23 Oracle学习笔记-存储过程与存储函数
- 2024-10-23 Oracle究竟有没有过时? oracle现在怎么样
你 发表评论:
欢迎- 552℃Oracle分析函数之Lag和Lead()使用
- 546℃几个Oracle空值处理函数 oracle处理null值的函数
- 543℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 537℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 534℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 522℃【数据统计分析】详解Oracle分组函数之CUBE
- 509℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 498℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端密码加密 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)