由于每一版本的优化器都变得更为完善,Oracle 为更改您的 SQL 执行计划提供了不断增多的方法。Oracle 提示的最常见用处是作为调试工具。您可以使用提示来确定最优的执行计划,然后向回执行,调节统计量,使调整后的 SQL 模拟所提示的查询。
使用 Oracle 提示可能非常复杂,而 Oracle 开发人员只是将提示用作最后的手段,首先应改变统计量来更改执行计划。Oracle 包含 124 种以上的提示,其中许多提示在 Oracle 文档中找不到。(参见列表 1)
让我们快速浏览如何使用提示来改变优化器执行计划:优化器提示是放置在 SQL 语句的注释内的优化器指示,用于那些不常出现的情况,即优化器作出了关于执行计划的不正确决策。由于提示处于注释内,因此确保提示名称拼写正确并确保提示适用于该查询十分重要。
例如,以下提示是无效的,因为 first_rows 访问与并行访问相互排斥。这是因为 parallel 始终假定进行全表扫描,而 first_rows 支持进行索引访问。
-- An invalid hint
select /*+ first_rows parallel(emp,8)*/
emp_name
from
emp
order by
ename;
某些 Oracle 专业人员会将提示集合在一起,以强化他们的期望。例如,如果我们有一台具有八个或更多 CPU 的 SMP 服务器,则我们可能希望使用 Oracle 并行查询来加速合法的全表扫描。在使用并行查询时,我们很少会希望在表一级启用并行机制 (alter table customer parallel 35;),因为表的并行机制设置会影响优化器,导致优化器认为全表扫描的代价并不高。因此,多数 Oracle 专业人员在逐个查询的基础上指定并行查询,将完全提示与 parallel 提示联合使用,以确保快速的并行全表扫描:
-- A valid hint
select /*+ full parallel(emp,35)*/
emp_name
from
emp
order by
ename;
既然我们已经了解了提示的一般性概念,就让我们来观察优化器调整最重要的提示之一。
ordered 提示确定查询执行的驱动表,还指定将表联接在一起的顺序。ordered 提示要求表应该以它们在 from 子句中所指定的顺序进行联接,from 子句中的第一个表指定为驱动表。使用 ordered 提示可以节省大量的分析时间,并加速 SQL 的执行,因为您告诉优化器联接表的最佳顺序。
例如,以下查询使用排序提示,将表以它们在 from 子句中指定的顺序联接起来。在该示例中,我们通过指定 emp 到 dept 的联接使用散列联接,sal 到 bonus 的联接使用嵌套循环联接,进一步改进了执行计划:
select
/*+ ordered use_hash (emp, dept) use_nl (sal, bon) */
from
emp,
dept,
sal,
bon
where . . .
当然,ordered 提示最常用于数据仓库查询或联接超过五个表的 SQL 中。
分享到:
相关推荐
控制执行计划主要通过使用Oracle的提示(HINT)或OUTLINE来实现,以适应不同场景下的性能需求。 - **使用HINT**:HINT允许开发者直接干预Oracle优化器的决策过程,例如: - 改变表的连接顺序或连接方式。 - 使用...
如果数据库环境发生变化,比如统计信息的更新,Oracle数据库可以使用SQLProfile来指导优化器选择最优的执行计划,而不需要改变原有SQL语句的结构。创建SQLProfile后,系统管理员可以通过DBMS_SPM包来管理SQLProfile...
- 使用` Hint`:在SQL语句中添加提示,强制优化器采用特定的执行计划。 - 重新收集统计信息:当数据发生显著变化时,应更新统计信息。 - 修改索引:创建、删除或重建索引以适应查询模式。 - 调整优化器参数:...
为了解决这一问题,引入了索引提示`/*+ INDEX (tablename indexname) */`,强制SQL执行计划使用指定索引`INDEX3_PERSON`进行查询。 修改后的SQL语句如下: ```sql UPDATE /*+ INDEX (per INDEX3_PERSON) */ ...
语句级别:通过 HINT 提示来选择执行计划,例如:SELECT /*+ RULE*/ E.ename, d.deptno FROM emp e, dept d WHERE e.deptno = d.deptno。 解决索引不走的问题: * 优化器模式选择是 all_row,因返回行会很多,...
3. **使用SQL Hint**:例如,在SQL语句中添加`/*+ INDEX (table_name index_name) */`提示来强制使用特定的索引。 #### 四、总结 理解和掌握Oracle优化器的工作原理对于优化SQL语句至关重要。通过合理设置优化模式...
- **案例3:使用提示**:利用SQL提示引导优化器选择更优的执行计划。 #### 二、性能调整综述 - **应用程序级调优**: - **SQL语句调优**:专注于SQL语句本身,通过优化查询逻辑、索引使用等来提高性能。 - **...
- 使用`USE_HASH`、`INDEX`等提示来指导优化器选择特定类型的执行计划。 - 通过`DBMS_STATS.SET_TABLE_PREFS`设置特定表的统计偏好,影响优化器决策。 - **2.1.5 可以nologging执行的操作** - 在某些情况下,...
在 Oracle 中,可以通过一些提示(hint)来控制并行执行,如使用“parallel”提示来指定查询并行执行时应该使用的线程数。同时,还有一些数据库配置参数可以控制并行操作的各个方面,比如系统级别的并行处理的限制,...
在性能优化方面,该手册会讲解如何使用SQL优化器、提示(hint)以及分析执行计划来提高SQL语句的效率。数据完整性部分则着重介绍如何通过约束和触发器来保证数据库中的数据正确性。备份与恢复章节则涉及到如何在面对...
本文将对Oracle优化的常用概念进行解析,涵盖CBO/RBO、表连接方式、执行计划、统计信息和柱状图、索引、分区表、AWR、表扫描方式、hint等内容。 一、CBO/RBO CBO(Cost-Based Optimizer)是一种基于成本的优化器,...
通过提示及配置文件等来控制执行计划; 在程序中优化查询而无需改动代码。 作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行的方向,赋予了他们不断开拓的动力。 作者简介 KAREN MORTON 研究...
### 使用Hint提示和日志控制减少操作时间 为了进一步减少数据操作的时间消耗,文档提出了使用SQL Hint和调整日志记录方式的建议。`/*+Append*/`提示指示Oracle数据库使用追加模式执行插入操作,避免了行级锁定,...
5. **改写SQL语句、使用HINT、调整索引、表分析**:根据执行计划的反馈,修改SQL语句,添加执行提示(`HINTS`),调整索引策略,甚至进行表分析以优化性能。 6. **有些SQL语句不具备优化的可能,需要优化处理方式**:...
7. SQL性能调优:这包括理解执行计划,能够对查询进行调整,例如选择合适的连接方法、优化子查询、使用提示(hint)等。 8. 安全性:在高级编程中,确保数据的安全性也是至关重要的。这涉及如何通过SQL语句来实现...
虽然MySQL也支持SQL提示(HINT),但功能相对有限。 #### MySQL配置与安装 - **配置向导**:使用MySQL配置向导进行基本配置,包括设定端口号(通常是3306)、默认字符集(推荐使用UTF-8以支持多语言环境)、添加...
§15.1 提示(Hint)概念 184 §15.1.1 提示的指定 184 §15.2 使用提示 185 §15.2.1 提示的指定 185 §15.2.1.1 ALL_ROWS 186 §15.2.1.2 FIRST_ROWS 186 §15.2.1.3 CHOOSE 186 §15.2.1.4 RULE 187 §15.2.2 ...
7. **提示和变量**:使用DEFINE定义变量并在SQL语句中使用,TIP和HINT用于添加注释。 通过这份文档,用户不仅可以学习Oracle数据库的基本操作,还能深入理解SQL*Plus的使用,从而更高效地管理和维护Oracle数据库...
- **使用提示(Hints)**:在SQL语句中加入特定的提示来引导优化器选择特定的执行路径。 - **索引管理**:合理创建和维护索引,提高查询速度。 - **统计信息维护**:定期更新表和索引的统计信息,确保优化器做出准确的...