转:Oracle Outline的使用及注意事项

概述
Oracle Outline是用来保持SQL执行计划(execution plan)的一个工具。我们可以通过outline工具防止SQL执行计划在数据库环境变更(如统计信息,部分参数等)而引起变化。
Outline的主要使用在以下情况:
1.
为避免在升级后某些sql出现严重性能下降而且在短时间内不能优化的情况,
我们可以使用outline的功能将原生产库中的sql执行计划实施在新的数据库上。
2.
为避免SQL的执行计划在统计数据不准确的情况(如未能及时收集表或索引的统计信息)下导致变化从而引起的性能降低。
3.
避免大规模分布实施的应用出现数据库版本、配置等区别引起的优化器产生不同的执行计划。
4.
某些Bug引起优化器生成较差的执行计划。在bug修复前我们可以使用outline来强制SQL的执行计划的正确。
Outline的机制是将所需要的执行计划的hint保存在outline的表中。当执行SQL时,Oracle会与outline中的SQL比较,如果该SQL有保存的outline,则通过保存的hint生成执行计划。
Outline的使用注意事项
Outline的使用需要注意以下事项。
1.
Outln用户是一个非常重要的系统用户,其重要性跟sys,system一样。在任何情况下都不建议用户删除outln,否则会引起数据库错误。
2.
优化器通过Outline生成执行计划前提是outline内所有hint都有效的。如:索引没有创建的前提下,索引的hint是失效的,导致该SQL的outline计划不会被使用。
3.
参数Cursor_sharing=force时不能使用outline。
4.
literial sql的共享程度不高,Outline针对绑定变量的sql较好。针对literial sql的情况,需要每条sql都生成outline。
5.
创建outline需要有create any outline的权限。
6.
要注意从CBO的角度来看,数据库表和索引的统计信息是随着数据量的变化而不断改变的。固定的执行计划在某些时段并不一定是最优的执行计划。所以outline的使用是要根据具体情况来决定的。
Outline使用举例
本文举例说明如何使用outline,并且将outline的内容从8i迁移到10g的数据库上使用。
操作步骤以scott用户为例说明。
8i,10g中在scott用户下创建测试表以说明outline的使用.
Login as scott
Create table t_test(col1 varchar2(2));
1.
确定8i生产库的db,listener处于关闭的状态。
2.
启动8i生产库instance.
3.
8i库使用system用户登陆,赋create any outline权限给sql执行用户。
Grant create any outline to scott;
4.
8i库使用scott用户登陆。
Create outline t_ol1 for category special on select * from t_test where col1=’00’;
T_ol1àoutline name
(注意每个outline都需要使用唯一的名字,不能重复)
Specialàoutline所属的类(category)
Select * from t_test where col1=’00’;à需要保存outline的sql
5.
10g,8i库Unlock并修改outlin用户口令。注意,outln用户的口令可以修改但是outln用户不能删除。
Alter user outln identified by outln account unlock;
6.
在8i库使用outln用户,导出outline数据。
Exp outln/outln tables=ol/$ ol/$hints file=ol.dmp log=ol_exp.log
将export的数据拷贝到10g库所在机器
7.
在10g库使用outln用户导入outline数据
imp outln/outln file=ol.dmp ignore=y log=ol_imp.log
8.
在10g库使用sys用户更新ouline的signature
connect sys/manager
exec dbms_outln.update_signatures;
启用stored outline
alter system set use_stored_outlines=special;
à指定outline category
9.
检测outline是否被使用
connect scott/tiger
create index I_test on t_test (col1);
à创建索引,以改变执行计划
explain plan for select * from t_test where col1=’00’;
@?/rdbms/admin/utlxplp
PLAN_TABLE_OUTPUT
Plan hash value: 4036493941
----------------------------------------------------------------------------
| Id  | Operation                                         | Name      | Rows  | Bytes      | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | select STATEMENT                       |                 |     1      |     3           |  1200   (4)       | 00:00:17 |
|*1  |TABLE ACCESS FULL                   | T_TEST |     1      |     3           |  1200   (4)      | 00:00:17 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("COL1"='00')
Note
-----
   - outline "OL1" used for this statement
à
注意执行计划指出online已经使用
17 rows selected.
说明outline已经启用。
如果没有outline的情况下应该使用索引,执行计划如下。
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 614253159
---------------------------------------------------------------------------
| Id  | Operation                        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | select STATEMENT     |                |     1      |          3 |     3   (0)          | 00:00:01 |
|*  1 |  INDEX RANGE SCAN| I_TEST |     1      |          3 |     3   (0)          | 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("COL1"='00')
Outline维护
停止db使用outline功能:
alter system set use_stored_outlines=false;
disable/enable具体outline:
alter outline ol_name disable;
alter outline ol_name enable;
删除outline category:
9i, 10g: exec dbms_outln.drop_by_cat(‘category_name’);
8i: exec outln_pkg.drop_by_cat(‘category_name’);
outline相关视图
dba_outlines
检查outline是否存在
select
name, category, owner from dba_outlines;
dba_outline_hints
该视图列出outline的hints内容

### 关于 OceanBase 和 Oracle 的操作练习与教程 OceanBase 是一款分布式关系型数据库,其兼容性模式允许开发者以较低的成本迁移来自其他数据库系统的应用。对于希望从 Oracle 迁移到 OceanBase 或者学习如何在 OceanBase 中实现类似 Oracle 功能的用户来说,以下是一些关键的操作练习和教程示例。 #### 1. **OceanBase 数据库简介及其与 Oracle 的对比** OceanBase 提供了多种兼容模式,其中包括 MySQL 模式和 Oracle 模式[^1]。这意味着用户可以在 OceanBase 上运行原本基于 Oracle 开发的应用程序而无需大量改动。了解这两种模式之间的差异以及它们各自适用的场景是非常重要的。 #### 2. **创建 Outline优化查询性能** 类似于 Oracle 中的 Hint 使用方法,在 OceanBase 中可以通过创建 Outline 来锁定特定 SQL 查询计划。这有助于提高复杂查询的稳定性和效率。Outline 可以通过 `SQL_TEXT` 或 `SQL_ID` 创建[^2]。以下是使用 SQL_ID 创建 Outline 的简单例子: ```sql CREATE OUTLINE my_outline FOR 'SELECT * FROM employees WHERE department_id = :id' USING sql_id='abc123'; ``` 此命令将为指定的 SQL 语句生成一个名为 `my_outline` 的轮廓,并绑定到对应的 SQL_ID。 #### 3. **数据导入与同步** 当从传统的关系型数据库迁移到 OceanBase 时,通常需要完成大量的数据传输工作。可以利用工具或者脚本把现有的库表结构连同数据一起移到目标环境。如果选择的是远程服务器上的 OceanBase 集群,则可能需要用到 scp 命令或者其他网络协议来上传必要的文件;当然也支持直接连接本地客户端软件如 mysql client 或 ob client 执行相关指令[^3]。 例如,假设已经准备好了一个 dump 文件叫做 `data.sql` ,那么可以用下面的方式加载它: ```bash obclient -h<host> -P<port> -u<username>@<tenant_name> -p < data.sql ``` #### 4. **手动部署 OBProxy 并测试连接** 为了简化访问路径并提升用户体验,建议安装 OBProxy 组件作为中间层服务。按照官方文档指导完成 RPM 包形式的手动部署过程之后,记得验证新设置是否正常运作[^5]。比如尝试 ping 测试确认端口可达性,接着登录检查基本功能可用状态等等。 #### 5. **注意事项:配置管理的最佳实践** 值得注意的一点是,一旦通过 OBD 工具完成了初始部署流程以后,任何后续针对原始 YAML 配置模板所做的更改都不会自动反映回实际运行环境中去除非重新触发整个更新周期[^4]。因此务必小心维护这些重要资源以免造成不必要的麻烦。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值