24. 用>=替代>
如果DEPTNO上有一个索引,
高效:
SELECT *
FROM EMP
WHERE DEPTNO >=4
低效:
SELECT *
FROM EMP
WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
25.用UNION替换OR (适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.
在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
注意:
WHERE KEY1 = 10 (返回最少记录)
OR KEY2 = 20 (返回最多记录)
ORACLE 内部将以上转换为
WHERE KEY1 = 10 AND
((NOT KEY1 = 10) AND KEY2 = 20)
26. 避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.
因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
举例:
低效: (索引失效)
SELECT …
FROM DEPARTMENT
WHERE DEPT_CODE IS NOT NULL;
高效: (索引有效)
SELECT …
FROM DEPARTMENT
WHERE DEPT_CODE >=0;
27.总是使用索引的第一个列
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.
当仅引用索引的第二个列时,优化器使用全表扫描而忽略索引
28.用UNION-ALL 替换UNION ( 如果有可能的话)
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.
如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.
举例:
低效:
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = ’31-DEC-95’
UNION
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = ’31-DEC-95’
高效:
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = ’31-DEC-95’
UNION ALL
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = ’31-DEC-95’
注:
需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是
要从业务需求分析使用UNION ALL的可行性.
29.使用提示(Hints)
对于表的访问,可以使用两种Hints.
FULL 和 ROWID
FULL hint 告诉ORACLE使用全表扫描的方式访问指定表.
例如:
SELECT /*+ FULL(EMP) */ *
FROM EMP
WHERE EMPNO = 7893;
ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID
的操作访问表.
通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引.
如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留
在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用.
例如:
SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ *
FROM WORK;
索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称
例如:
SELECT /*+ INDEX(LODGING) */ LODGING
FROM LODGING
WHERE MANAGER = ‘BILL GATES’;
在不使用hint的情况下, 以上的查询应该也会使用索引,然而,如果该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引. 在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引.
ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等.
注:
使用hint , 表示我们对ORACLE优化器缺省的执行路径不满意,需要手工修改.
这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化.
对ORACLE的优化器还是要有信心(特别是CBO)
分享到:
相关推荐
Oracle数据库调优是提高数据库性能的关键技术,它涉及到多个层面,包括硬件配置、数据库结构、SQL查询优化、存储参数调整等。以下将详细介绍这两种调优方案,并涉及相关的Oracle数据库调优知识点。 一、物理硬件与...
### Oracle系统调优方法 #### 一、Oracle性能调优的重要性及目标 Oracle数据库作为业界领先的企业级数据库管理系统之一,在企业信息化建设中扮演着至关重要的角色。为了确保Oracle数据库能够高效稳定地运行,并且...
SQL 优化建议是 Oracle 调优的一个重要步骤,它涉及到 SQL 语句优化、索引使用优化、多表关联查询操作优化等。通过对 SQL 语句的优化,可以提高数据库的响应速度和吞吐量。 11. SQL 分析工具 SQL 分析工具是 ...
- **使用SQL Tuning Advisor和SQL Access Advisor**:针对特定SQL语句提出调优建议。 - **处理死锁和锁争用**:分析v$lock视图,诊断和解决锁相关的问题。 - **分析和优化表空间的使用情况**:例如,使用表空间映射...
- **ADDM(Automatic Database Diagnostic Monitor)**:自动数据库诊断监控器,基于AWR数据生成诊断报告,提供性能调优建议。 - **V$视图**:Oracle 提供了大量的动态性能视图(V$ Views),这些视图包含了关于...
Oracle数据库性能调优是数据库管理员和开发人员的关键技能之一,尤其在处理大数据量、高并发的业务场景下显得尤为重要。"Oracle性能调优向导"这本书旨在为读者提供全面而实用的Oracle性能优化策略和技巧。 一、...
以下是一些重要的实践建议: - **表的设计**:合理设计表结构,采用适当的索引策略。 - **索引的使用**:创建必要的索引以加速查询,同时避免过度索引导致的维护成本增加。 - **回滚段和重做日志**:根据并发事务量...
Oracle数据库编程调优手册是一本针对数据库开发者和管理员的重要参考资料,旨在帮助他们提升Oracle数据库的性能和效率。手册涵盖了多个关键领域,包括数据加载优化、UPDATE语句的优化、DELETE操作的改进、DBA级别的...
13. **SQL优化工具**:Oracle提供了一些内置工具,如SQL Tuning Advisor和Automatic Workload Repository (AWR),它们可以帮助识别性能问题并提出优化建议。 Oracle 19C SQL调优是一门深入且实践性强的学问,需要...
Oracle 性能调优大全 Oracle 是一个功能强大的关系数据库管理系统,但是随着数据库的增长,性能问题开始变得越来越重要。为此,我们需要对 Oracle 进行性能调优,以提高数据库的响应速度和效率。下面是 Oracle ...
《Oracle 19C SQL调优指南》是针对Oracle数据库管理员(DBA)的重要参考资料,尤其适合那些希望提升SQL性能的专业人士。SQL调优是数据库管理中的核心技能,它关乎到系统的响应时间、资源利用率和整体性能。Oracle 19C...
### Oracle数据库查询调优知识点详解 #### 一、概述 在Oracle数据库中,查询调优是提高系统性能的关键环节之一。随着数据量的增长和技术的进步,优化查询变得日益重要。本篇将详细介绍如何识别问题、收集数据、分析...
4. **并行执行**:并行执行(Parallel Execution)是Oracle数据库中的一个重要特性,它可以将大型操作分成多个部分并同时执行,从而显著提高处理速度。在案例中,通过union all进行并行插入可以加快数据加载。 5. *...
4. **如何分析ORACLE执行计划**:通过工具如`EXPLAIN PLAN`或`TKPROF`,我们可以查看并分析执行计划,找出可能导致性能问题的环节。`TKPROF`尤其适用于跟踪和分析SQL语句的执行性能,提供详细的执行时间和资源使用...
### Oracle SQL调优原则 #### 一、使用索引的重要性 - **索引与全表扫描的对比**:虽然在某些特殊情况下,使用索引可能会稍微慢于全表扫描,但这通常只存在于同一数量级上的差异。而在大多数情况下,使用索引能够...
### Oracle性能调优技术内幕 #### 一、优化语录与原则 1. **优化一点总比什么都不做强**:在数据库性能调优过程中,即便是最小的改进也能带来显著的效果。 2. **没有任何东西可以替代最佳的SQL语句**:编写高效、...
- **SQL调优顾问**:使用Oracle的内置工具进行SQL优化建议。 3. **存储结构优化**: - **表和分区设计**:选择合适的表空间、段、区、块大小,以及分区策略(范围、列表、哈希等)。 - **表压缩**:了解Oracle的...
### Oracle实例调优知识点 #### 一、Oracle实例概述 Oracle数据库系统中的一个实例是指一组内存结构和进程,这些内存结构和进程共同管理一个物理数据库文件。实例是数据库的一个运行时映像,它包含了用于访问数据库...
本文主要探讨了在Oracle数据库性能优化实践中的一些心得,重点关注等待事件和操作系统层面的问题。 首先,文章指出现在的性能优化策略已经转向优化等待事件,即关注数据库在执行过程中遇到的等待问题。这些等待事件...