在CBO的优化模式下,我们可以使用optimizer_mode参数控制优化模式。主要有两种模式,一种是ALL_ROWS模式,另外一种是FIRST_ROWS模式。
ALL_ROWS模式适用场景:希望优化程序给出一种尽快得到全部记录的执行计划,目标是增加系统的吞吐量。
FIRST_ROWS模式使用场景:希望优化程序给出一种可以迅速的得到第一行的执行计划,目标是减少系统的响应时间。
两种模式需要具体场景具体分析,比如常见的Web应用,很少有一次性得到全部记录的情况,都是分多页交互的响应操作者,因此默认的ALL_ROWS模式就不太适合了,应该考虑使用FIRST_ROWS模式进行优化。
又如,我们想要生成全部数据的报表,那么默认的ALL_ROWS模式就比较的适合。
通过一个实验看一下两种优化模式下的执行计划的不同之处。
1.默认情况下,数据库采用ALL_ROWS模式。
sec@ora10g> show parameter optimizer_mode
NAME TYPE VALUE
------------------- -------------------- -----------------
optimizer_mode string ALL_ROWS
2.创建千万级别的测试表t,开启autotrace,查看一下默认ALL_ROWS模式下的执行计划。
sec@ora10g> set autot trace explain
sec@ora10g> select t1.x, t2.x from t t1, t t2 where t1.x = t2.x and t1.owner='SEC';
Execution Plan
----------------------------------------------------------
Plan hash value: 2371815244
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99695 | 2823K| | 43627 (1)| 00:08:44 |
|* 1 | HASH JOIN | | 99695 | 2823K| 3408K| 43627 (1)| 00:08:44 |
|* 2 | TABLE ACCESS FULL | T | 99695 | 2239K| | 29985 (1)| 00:06:00 |
| 3 | INDEX FAST FULL SCAN| PK_T | 9969K| 57M| | 4871 (2)| 00:00:59 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."X"="T2"."X")
2 - filter("T1"."OWNER"='SEC')
优化程序给出了一个快速获得t表全部记录的执行计划,使用到了索引快速全扫描的方式执行,总的执行时间较快。
3.修改优化模式为FIRST_ROWS模式后,再次查询其执行计划。
sec@ora10g> alter session set optimizer_mode =first_rows;
Session altered.
sec@ora10g> select t1.x, t2.x from t t1, t t2 where t1.x = t2.x and t1.owner='SEC';
Execution Plan
----------------------------------------------------------
Plan hash value: 217223811
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 99695 | 2823K| 129K (1)| 00:25:57 |
| 1 | NESTED LOOPS | | 99695 | 2823K| 129K (1)| 00:25:57 |
|* 2 | TABLE ACCESS FULL| T | 99695 | 2239K| 29985 (1)| 00:06:00 |
|* 3 | INDEX UNIQUE SCAN| PK_T | 1 | 6 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("T1"."OWNER"='SEC')
3 - access("T1"."X"="T2"."X")
优化程序给出了一种快速获得t表第一条记录的执行计划,使用到了索引唯一性扫描的方式执行,总的执行时间相对ALL_ROWS模式就长了许多。
4.参考一下Oracle 10g官方文档关于optimizer_mode参数的描述
OPTIMIZER_MODE
<!-- class="inftblinformal -->
OPTIMIZER_MODE
establishes the default behavior. for choosing an optimization approach for the instance.
Values:
-
first_rows_
n
The optimizer uses a cost-based approach and optimizes with a goal of best response time to return the firstn
rows (wheren
= 1, 10, 100, 1000).
-
first_rows
The optimizer uses a mix of costs and heuristics to find a best plan for fast delivery of the first few rows.
-
all_rows
The optimizer uses a cost-based approach for all SQL statements in the session and optimizes with a goal of best throughput (minimum resource use to complete the entire statement).
5.小结
这种优化手段给我们的启示是什么?Oracle默认的优化模式并不一定是我们想要的,必须根据自己的系统特点细心的定制。
Oracle的自动化进程越来越快,这就给一些DBA一种普遍的误解,认为在数据库层面上基本上不用做过多的优化调整,只要按照Oracle的自动化策略走就可以了。这种想法是不正确的。越是自动化,其优化细节就隐藏的越深,越是要静下心来深入的探索和调整。
Good luck.
-- The End --
本文为转载至secooler 快乐的DBA 空间,谢谢分享。
分享到:
相关推荐
Oracle提供了多种类型的优化器,包括基于规则的优化器(RBO)和基于成本的优化器(CBO)。然而,CBO是现代Oracle版本中的默认选择,因为它能根据统计信息和实际系统资源消耗来评估执行计划的成本。 CBO依赖于统计...
Oracle Cost-Based Optimizer (CBO) 是Oracle数据库中的一种查询优化策略,它通过评估不同查询执行计划的成本来选择最优的执行路径。在这个学习笔记中,我们将深入探讨Oracle中的Hash Join操作,这是一种重要的联接...
Oracle优化器主要分为两种:基于规则的优化器(RBO)和基于成本的优化器(CBO)。随着Oracle版本的演进,CBO已成为默认选择,它依赖于统计信息、成本模型和系统性能指标来评估执行计划的成本,并选择成本最低的计划...
Oracle有多种优化器,如RBO(Rule-Based Optimizer,基于规则的优化器)和CBO(Cost-Based Optimizer,基于成本的优化器)。CBO是现代Oracle数据库的默认优化器,它通过估算不同执行计划的成本来选择最优路径。这个...
优化器的选择策略包括基于成本的优化器(Cost-Based Optimizer, CBO)和基于规则的优化器(Rule-Based Optimizer, RBO),在Oracle 9i中,CBO已成为默认选项。学习如何配置和调整优化器参数,如统计信息的收集、表...
在Oracle数据库中,基于成本的优化器(Cost-Based Optimizer, CBO)是决定SQL查询执行计划的关键组件。CBO通过估算不同执行路径的成本,选择成本最低的执行计划来提高查询性能。理解CBO的工作原理和影响因素,是...
- **优化器模式**:理解CBO(成本基优化器)和RBO(规则基优化器),选择合适的优化策略。 - **执行计划提示**:通过SQL Hint指导优化器选择更优的执行路径。 2. 索引策略: - **B树索引**:最常见类型,适用于...
本次培训主要围绕SQL语句的执行过程、Oracle优化器、表之间的关联、获取SQL执行计划以及如何分析执行计划等核心内容展开。 首先,理解SQL语句的执行过程至关重要。SQL语句包括查询语句、DML语句(INSERT、UPDATE、...
2. 优化器选择:Oracle有Cost-Based Optimizer(CBO)和Rule-Based Optimizer(RBO)两种优化器。CBO基于成本计算最佳执行路径,而RBO则遵循预设规则。通常,CBO能提供更好的性能。 3. 分区技术:通过分区可以将大...
1. **基于成本的优化器(CBO)**:Oracle从8i版本开始默认采用CBO,它根据执行计划的成本来选择最佳查询路径。CBO通过估算不同执行计划的代价来决定哪个是最优的。代价通常包括I/O成本、CPU成本和内存成本。 2. **...
9. **SQL Profile与SQL Plan Baseline**:Oracle提供SQL Profile和SQL Plan Baseline来稳定执行计划,避免由于CBO(成本基优化器)的错误估计导致的性能问题。 10. **数据库升级与补丁应用**:随着Oracle版本的更新...
成本基础优化器(CBO)是Oracle SQL优化器的一种,它基于统计信息和成本模型来决定执行计划。CBO会根据可能的成本选择最优的查询执行路径。 11. 如何统计数据库数据 在Oracle中,统计数据库数据是为了让优化器更好...
《Oracle优化日记:一个金牌DBA的故事》这本书深入探讨了Oracle数据库的性能优化技术,是DBA们不可或缺的参考资料。作者通过自身丰富的实战经验,分享了一系列解决实际问题的方法和策略,帮助读者理解Oracle数据库的...
2. **查询优化器**:Oracle的CBO(Cost-Based Optimizer)是查询执行计划选择的核心。书中将深入讲解CBO的工作原理,包括统计信息的收集、成本模型、执行计划的生成与比较,以及如何影响优化器的决策。 3. **SQL...
《Oracle SQL性能优化》这本书是数据库管理员和开发人员的...这个CHM文件可能包含了Oracle查询优化器的详细文档,是学习和解决问题的宝贵资源。通过阅读和实践,你可以提升自己在Oracle数据库性能优化方面的专业技能。
通过以上内容的学习,我们可以了解到ORACLE存储过程性能优化的重要性和具体实施方法。合理选择优化器、充分利用索引以及避免不当的查询操作都是提高存储过程性能的关键。希望本文能够帮助您更好地理解和掌握ORACLE...
CBO是Oracle默认的优化器,它根据表统计信息和系统资源成本估算来选择执行计划。 2. **索引优化**:索引是提高查询速度的关键。B树索引、位图索引、物化视图索引等都是常见的Oracle索引类型。选择合适的索引类型,...
了解索引有效性通常需要进行分析,因为Oracle的Cost-Based Optimizer (CBO)会基于统计信息来决定最佳执行路径。执行计划是理解SQL如何执行的关键,它揭示了查询的逻辑顺序,包括排序合并连接、嵌套循环和哈希连接等...
Oracle的查询优化器(CBO, Cost-Based Optimizer)会根据统计信息和成本模型选择执行计划。了解CBO的工作原理,提供准确的统计信息,以及使用hints来引导优化器选择更优路径是优化查询的关键。 其次,索引策略对SQL...