optimizer_相关参数

本文详细介绍了SQL中的关键参数优化,包括optimizer_index_caching和optimizer_index_cost_adj,如何通过调整这些参数来优化CBO对执行计划的选择,特别针对数据仓库/报表系统和事物处理系统/OLTP系统的不同需求提供了具体的建议。
SQL> show parameter optimizer_


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean     FALSE
optimizer_dynamic_sampling           integer     2
optimizer_features_enable            string      11.2.0.3
optimizer_index_caching              integer     0
optimizer_index_cost_adj             integer     100
optimizer_mode                       string      ALL_ROWS
optimizer_secure_view_merging        boolean     TRUE
optimizer_use_invisible_indexes      boolean     FALSE
optimizer_use_pending_statistics     boolean     FALSE
optimizer_use_sql_plan_baselines     boolean     TRUE
SQL> 


Thomas建议:
对于许多系统,应到考虑设置这两个参数为非默认值,至少测试一下两种极端情形:
1. optimizer_index_caching=0 和 optimizer_index_cost_adj=100的默认值. 他们一般适用于许多数据仓库/报表系统
2. optimizer_index_caching=90和 optimizer_index_cost_adj=25的设置,他们一般适用于许多事物处理系统/oltp系统.


alter system set optimizer_index_caching=90 scope=spfile;
alter system set optimizer_index_cost_adj=25  scope=spfile;


optimizer_index_cost_adj
这个初始化参数代表一个百分比,取值范围在1到10000之间.
该参数表示索引扫描和全表扫描成本的比较。缺省值100表示:索引扫描成本等价转换与全表扫描成本。


对于数据仓库和DSS系统要反复调整来取一个合理值。
Oracle在选择不同的访问路径时,会对全表扫描和索引扫描进行比较评估,在比较的时候,
Oracle会把索引扫描的成本转换为全表扫描的成本与全表扫描的COST进行比较。这个转换需要一个转换因子,
就是Optimizer_index_cost_adj;
Optimizer_index_cost_adj*(index scan cost)=等价的Full Scan cost


所以 optimizer_index_cost_adj = Full Scan Cost / Index Scan Cost


对于自己的系统到底optimizer_index_cost_adj 的值是多少才是最合适的还是要经过自己的反复测试才确定的,不能盲目的改。




SELECT isses_modifiable, issys_modifiable
  FROM v$parameter
 WHERE name = 'optimizer_index_cost_adj';


ISSES_MODIFIABLE ISSYS_MODIFIABLE
---------------- ----------------
TRUE             IMMEDIATE       
1 row selected.
 --说明该参数可以在session级别动态改变,但不能在system级别动态改变


alter session set optimizer_index_cost_adj=100;
alter session set optimizer_index_cost_adj=1000;


在oltp系统中,可以考虑将optimizer_index_cost_adj参数值设小,使系统倾向于使用索引;在dss系统中,则可以考虑适当将该参数调大,影响oracle的决策过程。


这两个参数,都可以影响CBO对执行计划的选择。
一 Optimizer_index_caching
   Optimizer_index_caching是一个百分比的值,取值范围是0到99(缺省值为0),表示能在内存中找到需要的索引数据的可能性。比如optimizer_index_caching的值为50,CBO就会认为,有50%的可能性能找到所需要的索引数据,并根据这一可能性,估算执行计划的成本,选择执行计划。
二 optimizer_index_cost_adj
   Optimizer_index_cost_adj(adj=adjust)表示索引扫描和全表扫描的比值,取值范围是1-10000,默认值是100。跟optimizer_index_caching一样,这个值也是CBO用来计算成本的,并根据计算出来的成本,选择执行计划。假设optimizer_index_cost_adj的值是60,CBO会认为,索引扫描的成本是全表扫描成本的60%,然后根据这个计算SQL的执行成本。
`optimizer_switch` 参数从 MySQL 5.1 开始引入,用于控制 MySQL 优化器的行为,通过 `on` 和 `off` 来开启和关闭优化器行为,其使用有效期分为全局和会话两个级别,不同 MySQL 版本可取结果不同 [^3]。根据数据库实际情况调整该参数的方法如下: #### 分析数据库性能瓶颈 - **监控系统负载**:当数据库服务器压力大,如出现 `load` 一度达到 100,且有大量 SQL 语句处于 `result sorting` 状态时,这种排序会特别消耗 CPU 和内存资源。此时可抽取其中一条 SQL 查看执行计划,根据执行计划判断是否是某些优化特性导致了性能问题,进而考虑调整 `optimizer_switch` 中相关特性的开关 [^4]。 - **检查查询执行情况**:若遇到如 `select count(*)` 显示返回有数据,但 `select *` 返回空结果集这类奇怪问题,可能是 `optimizer_switch` 设置引起的 BUG,需要分析是哪个特性开关导致的问题并进行调整 [^2]。 #### 了解不同优化特性的作用 - **常见优化特性**:MySQL 不同版本的优化器会有很多新特性,如 MRR、BKA 等,`optimizer_switch` 可控制查询优化器怎样使用这些特性。例如,若想控制是否启用索引合并等优化策略,可调整 `index_merge`、`index_merge_union` 等子参数 [^2]。 #### 进行测试和调整 - **测试环境验证**:在调整 `optimizer_switch` 参数前,先在测试环境中进行验证。可以逐步开启或关闭某些优化特性,观察数据库性能和查询执行情况的变化。例如: ```sql -- 会话级别设置,开启 index_merge 和 index_merge_union SET optimizer_switch = 'index_merge=on,index_merge_union=on'; ``` - **生产环境微调**:在测试环境验证通过后,再在生产环境进行微调。每次调整后,持续监控数据库的性能指标,如响应时间、吞吐量等,确保调整对性能有积极影响。 #### 参考官方文档 不同 MySQL 版本的 `optimizer_switch` 可取结果不同,5.1 和 5.6 版本需参考官方文档来确定具体的参数取值和含义 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值