30.用WHERE替代ORDER BY
ORDER BY 子句只在两种严格的条件下使用索引.
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中所有的列必须定义为非空.
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.
例如:
表DEPT包含以下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
非唯一性的索引(DEPT_TYPE)
低效: (索引不被使用)
SELECT DEPT_CODE
FROM DEPT
ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE
FROM DEPT
WHERE DEPT_TYPE > 0
注:
ORDER BY 也能使用索引!
31.避免改变索引列的类型
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
假设 EMPNO是一个数值类型的索引列.
SELECT …
FROM EMP
WHERE EMPNO = ‘123’
实际上,经过ORACLE类型转换, 语句转化为:
SELECT …
FROM EMP
WHERE EMPNO = TO_NUMBER(‘123’)
31.避免改变索引列的类型
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
现在,假设EMP_TYPE是一个字符类型的索引列.
SELECT …
FROM EMP
WHERE EMP_TYPE = 123
这个语句被ORACLE转换为:
SELECT …
FROM EMP
WHERE TO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转换, 这个索引将不会被用到!
注:
为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型.
32.需要当心的WHERE子句
某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;
下面的例子中, ‘||’是字符连接函数. 就象其他函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’;
使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = ‘AMEX’
AND ACCOUNT_TYPE=’ A’;
下面的例子中, ‘+’是数学函数. 就象其他数学函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);
34. CBO下使用更具选择性的索引
基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率.
如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少的记录.
比如, 表中共有100条记录而其中有80个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8 . 选择性越高, 通过索引键值检索出的记录就越少.
如果索引的选择性很低, 检索数据就需要大量的索引范围查询操作和ROWID 访问表的
操作. 也许会比全表扫描的效率更低.
注:
下列经验请参阅:
a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.
b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的
区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
35.避免使用耗费资源的操作
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序.
例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.
通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.
注:
如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
36.使用显式的游标(CURSORs)
使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作.
37.优化EXPORT和IMPORT
使用较大的BUFFER(比如1MB , 1,024,000)可以提高EXPORT和IMPORT的速度.
ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.
38.分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘控制卡控制的硬盘上.
分享到:
相关推荐
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数据库中,查询调优是提高系统性能的关键环节之一。随着数据量的增长和技术的进步,优化查询变得日益重要。本篇将详细介绍如何识别问题、收集数据、分析...
Oracle内部调优培训主要涉及数据库性能优化的各种策略和技术,这些技术旨在提高数据库系统的效率和响应时间,确保系统能够处理大量的并发事务和数据操作。以下是一些关键知识点: 1. **性能调整**:性能调整是...
5. **如何干预ORACLE执行计划**:通过使用SQL hints,我们可以向优化器提供关于如何处理SQL的建议。另外,更新统计信息、创建合适的索引或者调整参数设置也是影响执行计划的有效手段。 6. **表之间的连接**和**访问...
### Oracle SQL调优原则 #### 一、使用索引的重要性 - **索引与全表扫描的对比**:虽然在某些特殊情况下,使用索引可能会稍微慢于全表扫描,但这通常只存在于同一数量级上的差异。而在大多数情况下,使用索引能够...
### Oracle性能调优技术内幕 #### 一、优化语录与原则 1. **优化一点总比什么都不做强**:在数据库性能调优过程中,即便是最小的改进也能带来显著的效果。 2. **没有任何东西可以替代最佳的SQL语句**:编写高效、...
- **SQL调优顾问**:使用Oracle的内置工具进行SQL优化建议。 3. **存储结构优化**: - **表和分区设计**:选择合适的表空间、段、区、块大小,以及分区策略(范围、列表、哈希等)。 - **表压缩**:了解Oracle的...
### Oracle实例调优知识点 #### 一、Oracle实例概述 Oracle数据库系统中的一个实例是指一组内存结构和进程,这些内存结构和进程共同管理一个物理数据库文件。实例是数据库的一个运行时映像,它包含了用于访问数据库...
本文主要探讨了在Oracle数据库性能优化实践中的一些心得,重点关注等待事件和操作系统层面的问题。 首先,文章指出现在的性能优化策略已经转向优化等待事件,即关注数据库在执行过程中遇到的等待问题。这些等待事件...