oracle性能优化简介

合集下载

oracle优化方法总结

oracle优化方法总结

千里之行,始于足下。

oracle优化方法总结Oracle优化是提高数据库性能和响应能力的重要步骤。

本文总结了一些常见的Oracle优化方法。

1. 使用索引:索引是提高查询性能的主要方法。

通过在表中创建适当的索引,可以加快查询速度,并减少数据访问的开销。

但是要注意不要过度使用索引,因为过多的索引会增加写操作的开销。

2. 优化查询语句:查询语句的效率直接影响数据库的性能。

可以通过合理地编写查询语句来提高性能。

例如,使用JOIN来替代子查询,尽量避免使用通配符查询,使用LIMIT来限制结果集的大小等。

3. 优化表结构:表的设计和结构对数据库的性能也有很大的影响。

合理的表设计可以减少数据冗余和不必要的数据存储,提高查询速度。

例如,适当地使用主键、外键和约束,避免过多的数据类型和字段等。

4. 优化数据库参数设置:Oracle有很多参数可以用来调整数据库的性能。

根据具体的应用场景和需求,可以根据情况调整参数的值。

例如,调整SGA和PGA的大小,设置合适的缓冲区大小,调整日志写入方式等。

5. 使用分区表:当表的数据量很大时,可以考虑将表分成多个分区。

分区表可以加速查询和维护操作,提高数据库的性能。

可以按照时间、地域、业务等来进行分区。

6. 优化存储管理:Oracle提供了多种存储管理选项,如表空间和数据文件管理。

合理地分配存储空间和管理数据文件可以提高数据库的性能。

例如,定期清理无用的数据文件,使用自动扩展表空间等。

第1页/共2页锲而不舍,金石可镂。

7. 数据压缩:对于大量重复数据或者冷数据,可以考虑使用Oracle的数据压缩功能。

数据压缩可以减少磁盘空间的使用,提高IO性能。

8. 使用并行处理:对于大型计算或者批处理任务,可以考虑使用Oracle的并行处理功能。

并行处理可以将任务分成多个子任务,并行执行,提高处理能力和效率。

9. 数据库分区:对于大型数据库,可以考虑将数据库分成多个独立的分区。

数据库分区可以提高数据的并行处理能力,减少锁竞争和冲突,提高数据库的性能。

ORACLE数据库性能优化

ORACLE数据库性能优化

(三)(三)优化 I/O 操作 I/O 优化被安排在内存优化之后,通过内存的优化,可以是 I/O 冲突减少,在此情况下, 可以通过一些调整以使 I/O 性能进一步提高。 对于新系统,应自顶向下分析 I/O 需求,确定所需要的资源。而对于已存在的系统应采 用自底向上的方法: 1.1.了解系统的磁盘数量。 2.2.了解 ORACLE 使用的磁盘数量。 3.3.了解应用系统的 I/O 类型。 4.4.了解 I/O 操作是针对文件系统还是原始设备。 5.5.了解对象在磁盘上的分布。 可以通过如下方法检查 I/O 问题: 检查系统 I/O 的使用:可以使用操作系统提供的工具来监视整个系统对磁盘 文件的访问,可以将大量访问磁盘的应用与 ORACLE 的相关文件分别存放。在 UNIX 系统中可以通过 sar –d 来获得有关数据。在 WINDOWS NT 中 可 通 过 性 能监视器查看。 检查 ORACLE 的 I/O 的使用:对于 ORACLE ,可以通过下列视图来获得相 关的信息: File Type Where to Find Statistics Database Files V$FILESTAT Log Files V$SYSSTAT, V$SYSTEM_EVENT, V$SESSION_EVENT Archive Files V$SYSTEM_EVENT, V$SESSION_EVENT Control Files V$SYSTEM_EVENT, V$SESSION_EVENT 可以通过如下的方法来解决 I/O 问题: 减少磁盘竞争: 磁盘竞争:当多个进程同时访问同一个磁盘时就会产生磁盘竞争。要减 少高负荷磁盘的访问,可以将高访问量的文件移到低负荷的磁盘上。 分离 Redo 日志文件和数据文件:ORACLE 总是经常的访问 Redo 日志 文件和数据文件,将二者放在一起,可能会增加磁盘冲突。 条带化表数据:条带化,就是将一个大表的数据分布到不同磁盘的不同 数据文件中,这样也可以减少磁盘冲突。 分离表和索引:这并不是必须的,由于索引和表的读取是串行的,也可 以做到将表和索引放在一起而不发生磁盘冲突。 磁盘条带化:就是将一个大表的数据分布到不同磁盘的不同数据文件中,条 带化允许不同的进程同时访问一个表的不同部分。 这尤其对随机访问一个表的多行 很有帮助。条带化可以是磁盘的 I/O 负载平衡。有两种条带化方法。 手动方法:利用表空间以及分区表的方式。

Oracle的性能优化

Oracle的性能优化

千里之行,始于足下。

Oracle的性能优化Oracle数据库性能优化是提高数据库性能的关键步骤之一。

通过对数据库的优化,可以提高查询速度、降低系统负载、提升系统稳定性,从而提高用户的体验。

下面将介绍一些常见的Oracle数据库性能优化策略。

1. 索引优化:索引是提高查询效率的重要手段,可以极大地减少查询时的磁盘I/O操作。

优化索引包括以下几个方面:- 选择合适的索引类型,如B树索引、位图索引等。

根据具体业务场景选择适当的索引类型。

- 考虑创建复合索引,将多个列放在同一个索引内,可以减少索引的数量,提高查询效率。

- 避免创建过多的索引,过多的索引会增大数据插入和更新的成本。

- 定时对索引进行统计信息收集,使优化器能够更好地选择索引执行计划。

2. 查询优化:- 避免使用SELECT *查询,只查询需要的列,减少数据传输量。

- 使用合理的JOIN语句,避免嵌套循环连接或者全表扫描。

- 使用EXISTS或IN替代NOT EXISTS或NOT IN,后者在数据量大时性能较差。

- 避免使用函数或者表达式作为WHERE条件,这会导致索引失效。

- 使用分页查询时,尽量使用ROWNUM而不是OFFSET/FETCH,后者性能较差。

3. 表结构优化:- 合理设计表结构,尽量避免冗余数据和重复字段。

- 使用正确的数据类型,减少存储空间的浪费。

第1页/共3页锲而不舍,金石可镂。

- 选择合适的表空间和存储策略,避免表空间的碎片化和数据文件的扩展问题。

- 定期清理无用数据,避免数据库膨胀过快。

4. 系统参数优化:- 调整SGA参数和PGA参数的大小,根据实际情况合理分配内存。

- 调整日志参数,如redo日志大小和checkpoint间隔,减少写入磁盘的次数。

- 调整并发参数,如并行度和数据库连接数,提高系统的并发性能。

5. 存储优化:- 使用合理的存储结构,如表空间、数据文件、表和索引的分布策略。

- 使用合适的存储介质,如固态硬盘(SSD)、闪存阵列等,提高存储性能。

Oracle 的性能优化概述

Oracle 的性能优化概述

Oracle 的性能优化概述一个数据库系统的生命周期可以分成设计、开发和成品三个阶段。

在设计阶段进行数据库性能优化的成本最低,收益最大。

在成品阶段进行数据库性能优化的成本最高,收益最小。

数据库的优化可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。

最常见的优化手段就是对硬件的升级。

据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优化。

许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。

一、数据库性能的优化数据库设计是应用程序设计的基础,其性能直接影响应用程序的性能。

数据库性能包括存储空间需求量的大小和查询响应时间的长短两个方面。

为了优化数据库性能,需要对数据库中的表进行规范化。

规范化的范式可分为第一范式、第二范式、第三范式、BCNF范式、第四范式和第五范式。

一般来说,逻辑数据库设计会满足规范化的前3级标准,但由于满足第三范式的表结构容易维护且基本满足实际应用的要求。

因此,实际应用中一般都按照第三范式的标准进行规范化。

但是,规范化也有缺点:由于将一个表拆分成为多个表,在查询时需要多表连接,降低了查询速度。

由于规范化有可能导致查询速度慢的缺点,考虑到一些应用需要较快的响应速度,在设计表时应同时考虑对某些表进行反规范化。

反规范化可以采用以下几种方法:1. 分割表分割表包括水平分割和垂直分割。

水平分割是按照行将一个表分割为多个表,这可以提高每个表的查询速度,但查询、更新时要选择不同的表,统计时要汇总多个表,因此应用程序会更复杂。

垂直分割是对于一个列很多的表,若某些列的访问频率远远高于其它列,就可以将主键和这些列作为一个表,将主键和其它列作为另外一个表。

通过减少列的宽度,增加了每个数据页的行数,一次I/O就可以扫描更多的行,从而提高了访问每一个表的速度。

但是由于造成了多表连接,所以应该在同时查询或更新不同分割表中的列的情况比较少的情况下使用。

Oracle的性能优化培训课件

Oracle的性能优化培训课件

利用应用程序性能监控工具,分析应用程序在服务器、网络和
客户端的性能表现。
管理数据库和应用程序性能
03
根据监控数据分析结果,及时调整数据库和应用程序配置,优
化性能表现。
04
Oracle硬件性能优化
服务器硬件优化
选择合适的CPU
根据Oracle软件的计算需求,选择多核、高主频的CPU,提高 计算性能。
功能
它提供了许多先进的功能,包括 自动存储管理和自动数据恢复、 闪回数据库、自动诊断和恢复、 自动内存管理和自动存储管理等 。此外,它还支持各种不同的应 用程序和开发工具。
总结
Oracle Database Enterprise Edition是Oracle性能优化培训的 重要工具之一,它可以帮助开发 人员更好地管理数据库,提高数 据库的性能。
Oracle性能优化工具和技术
Oracle Enterprise Manager
01
概述
Oracle Enterprise Manager是一个集成的云管理平台,它通过一个直
观的仪表板来提供对整个堆栈的管理,从物理和虚拟服务器到软件和数
据库。
02
功能
它提供了自动化的IT管理,以帮助企业实现更高的生产率。通过使用
根据实际业务需求,选择 合适的隔离级别,以避免 并发访问时的锁冲突和死 锁问题。
使用乐观锁
对于更新操作频繁的表, 可以使用乐观锁来控制并 发访问,减少锁的开销。
调整并发控制参数
根据系统负载和业务特点 ,调整并发控制参数,如 事务的隔离级别、锁的最 长时间等。
03
Oracle应用性能优化
应用程序逻辑优化
总结
Oracle SQL Developer是Oracle性能优化培训的重要工具之一,它可以帮助开发人员更 好地管理数据库,提高数据库的性能。

Oracle性能调优

Oracle性能调优

千里之行,始于足下。

Oracle性能调优
Oracle性能调优是指通过对数据库系统进行各种配置和优化,以提升数据库的响应速度、并发能力和稳定性,以满足用户的需求。

以下是一些常见的Oracle性能调优技巧:
1. 硬件配置:增加服务器的内存、CPU和磁盘等硬件资源,以提高数据库的整体性能。

2. SQL优化:通过检查和优化SQL语句,去除不必要的查询、索引不匹配等问题,以提高查询性能。

3. 索引优化:根据实际查询访问模式,设计合适的索引并定期进行重建和维护,以加快查询速度。

4. 数据库参数优化:调整Oracle数据库的各项参数,如SGA、PGA、缓冲池等,以提升数据库的性能。

5. 分区表和分区索引:将大表分割为多个小表,并使用分区索引来提高查询效率和维护性能。

6. 批处理操作:对于大批量的数据操作,尽量使用批处理操作,减少物理I/O次数,提高处理效率。

7. 数据库统计信息收集:定期收集和更新表的统计信息,以便查询优化器做出更准确的查询计划。

第1页/共2页
锲而不舍,金石可镂。

8. 资源管理:合理配置Oracle数据库的资源管理策略,如设置合适的连接数、并行度等,以实现最大化的利用率。

9. 数据库分析工具:使用各种数据库性能监控和分析工具,如AWR报告、SQL Trace等,来定位和解决性能瓶颈问题。

总结来说,Oracle性能调优是一个持续优化的过程,需要不断地监测、分析、调整和测试,以实现最佳的数据库性能。

同时,在调优过程中需根据具体情况进行有针对性的优化措施,以达到最好的性能效果。

Oracle数据库性能优化分析

Oracle数据库性能优化分析

千里之行,始于足下。

Oracle数据库性能优化分析Oracle数据库性能优化分析是指对Oracle数据库进行综合性能分析和优化的过程。

通过分析数据库的运行状况、识别潜在的性能瓶颈、确定解决方案并实施优化措施,可以提高数据库的性能和效率。

以下是Oracle数据库性能优化分析的一般步骤:1. 收集性能数据:通过Oracle的性能监控工具,如AWR报告、统计信息收集等,收集数据库的性能数据,包括CPU利用率、I/O响应时间、锁定情况等。

2. 确定性能瓶颈:通过分析性能数据,确定数据库中存在的性能瓶颈,如高CPU使用率、高IO等待、长时间的锁等待等。

3. 优化SQL语句:分析执行频次较高的SQL语句,通过重写SQL语句、调整索引和统计信息等方式,优化SQL语句的执行计划,减少IO开销和CPU消耗。

4. 优化数据库结构:根据应用的需求和查询模式,调整表结构、分区策略、索引设计等,以提高查询性能和数据访问效率。

5. 优化数据库配置参数:调整数据库的配置参数,包括缓冲区大小、日志大小、并发连接数等,以最大限度地利用硬件资源,提高数据库的吞吐量和响应时间。

6. 确保数据完整性和一致性:通过使用合适的约束和触发器,确保数据的完整性和一致性,防止数据错误和冲突对性能造成负面影响。

第1页/共2页锲而不舍,金石可镂。

7. 监控和调优:定期监控数据库的性能指标,如响应时间、吞吐量等,及时识别和解决潜在的性能问题,保持数据库的高可用性和性能稳定性。

需要注意的是,性能优化是一个综合性的工作,需要结合具体的应用场景和需求来进行分析和优化,没有一种通用的解决方案,需要根据实际情况进行定制化的优化措施。

同时,性能优化是一个持续改进的过程,需要定期评估数据库的性能状况,并根据需求进行调整和优化。

Oracle数据库性能优化与案例分析

Oracle数据库性能优化与案例分析

千里之行,始于足下。

Oracle数据库性能优化与案例分析Oracle数据库性能优化是指通过调整数据库的配置参数、优化SQL语句、增加索引等措施,以提升数据库的响应速度、减少资源消耗和提高系统的稳定性的过程。

下面是一个案例分析,介绍了一个实际的Oracle数据库性能优化案例。

案例分析:某公司使用Oracle数据库存储了大量的销售数据,随着数据量的增加,数据库的性能逐渐下降。

经过检查,发现以下问题:1. 缺少必要的索引:在数据库中存在大量的查询操作,但是缺少必要的索引导致查询效率低下。

解决方法:根据查询需求,为经常用到的列添加合适的索引,可以通过分析查询语句的执行计划来确定需要哪些索引。

同时,也要注意避免过多的索引导致性能下降。

2. SQL语句性能低下:存在一些复杂的SQL语句,执行时间较长。

解决方法:对于复杂的SQL语句,可以通过优化查询语句和重构查询逻辑来提升性能。

可以考虑使用JOIN操作替代子查询,避免使用全表扫描等。

3. 数据库参数设置不合理:数据库的一些配置参数没有进行调整,导致性能下降。

第1页/共2页锲而不舍,金石可镂。

解决方法:根据数据库的性能需求,适当调整一些关键的配置参数,如SGA和PGA的大小、缓冲区大小等。

4. 数据库统计信息过期:数据库的统计信息没有及时更新,导致查询优化器的估算不准确。

解决方法:定期收集和更新统计信息,可以使用Oracle提供的统计信息收集工具或者手动收集统计信息。

通过以上优化措施,可以显著提升Oracle数据库的性能,提高系统的响应速度和稳定性。

但需要注意,在进行性能优化时需要综合考虑多个因素,不能片面追求性能提升而导致其他问题的出现。

另外,性能优化也是一个持续的过程,需要定期检查和优化。

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。

以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。

通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。

2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。

3.查询优化:对SQL查询进行优化,使其更快地执行。

这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。

4.表分区:对大表进行分区可以提高查询效率。

分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。

5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。

例如,调整内存分配,可以提升缓存性能。

6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。

7.索引优化:创建和维护索引是提高查询性能的重要手段。

但过多的索引可
能会降低写操作的性能,因此需要权衡。

8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。

9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。

10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。

请注意,这些策略并非一成不变,需要根据实际情况进行调整。

在进行优化时,务必先备份数据和配置,以防万一。

第09章Oracle的性能优化

第09章Oracle的性能优化

9.2 SQL语句的优化
9.2.1 SQL语句的优化规则 9.2.2 SQL语句优化的具体方法
9.2.1 SQL语句的优化规则
(1)去掉不必要的大表、全表扫描。不必要的大表、全表 扫描会造成不必要的输入输出,而且还会拖垮整个数据库;
(2)检查优化索引的使用 这对于提高查询速度来说非常重 要;
(3)检查子查询,考虑SQL子查询是否可以用简单连接的 方式进行重新书写;
系统的服务器,可以使用sar –u命令查看CPU的使用率;NT 操作系统的服务器,可以使用NT的性能管理器来查看CPU 的使用率。
出现CPU资源不足的情况是很多的:SQL语句的重解析、 低效率的SQL语句、锁冲突都会引起CPU资源不足。
2.查看SQL语句的解析情况 (1)数据库管理员可以执行下述语句来查看SQL语句的解析 情况:
9.3 Oracle运行环境的优化
9.3.1 内存结构的调整 9.3.2 物理I/O的调整 9.3.3 CPU的优化调整 9.3.4 网络配置的优化 9.3.5 Oracle碎片整理 9.3.6 Oracle系统参数的调整
9.3.1 内存结构的调整
内存参数的调整主要是指Oracle数据库的系统全局区 (SGA)的调整。SGA主要由三部分构成:共享池、数 据缓冲区、日志缓冲区。
2.数据缓冲区 数据库管理员可以通过下述语句,来查看数据库数据缓冲区
的使用情况。
SELECT name, FROM v$sysstat WHERE name IN ('db block gets','consistent gets','physical reads');
根据查询出来的结果可以计算出数据缓冲区的使用命中率:

oracle性能优化的基本方法概述

oracle性能优化的基本方法概述

oracle性能优化的基本方法概述1)设立合理的性能优化目标。

2)测量并记录当前性能。

3)确定当前Oracle性能瓶颈(Oracle等待什么、哪些SQL语句是该等待事件的成分)。

4)把等待事件记入跟踪文件。

5)确定当前的OS瓶颈。

6)优化所需的成分(应用程序、数据库、I/O、争用、OS等)。

7)跟踪并实施更改控制过程。

8)测量并记录当前性能9)重复步骤3到7,直到满足优化目标1.设立合理的性能优化目标重点:关于设立目标的最重要的一点是它们必须是可量化和可达到的。

方法:目标必须是当前性能和所需性能的的陈述形式的语句。

只需填写下列语句中的空格即可。

花费了(时/分/秒),但要求它在(时/分/秒)内执行。

使用了(资源量),但它不能使用超过。

2.测量并记录当前性能重点:(1)需要在峰值活动时间获得当前系统性能快照(2)关键是要在出现性能问题的时间段内采集信息(3)必须在合理的时间段上采集,一般在峰值期间照几个为期15分钟的快照方法:执行STATSPACK-- 建立性能快照表空间sqlplus sys as sysdbacreate tablespace perfstat datafile '/u02/oradata/dbnms/perfstat.dbf' size 500M extent management local;-- 安装STATSPACK@$ORACLE_HOME/rdbms/admin/spcreate.sql;-- 获取性能数据,可以生成多个快照sqlplus perfstatexecute statspack.snap;-- 生成性能快照的报表sqlplus perfstatselect min(snap_id) snapid_min, max(snap_id) snapid_max fromstats$snapshot;@$ORACLE_HOME/rdbms/admin/spreport;-- 该报告中有关于性能的重要信息,如前5位的等待事件、cache大小、各种内存结构的命中率、每秒及每事务逻辑、物理读写数据块数、性能最差的sql语句等3.确定当前Oracle性能瓶颈重点:从Oracle 等待接口v$system_event、v$session_event和v$session_wait 中获得等待事件,进而找出影响性能的对象和sql语句方法:-- 首先,利用v$system_event视图执行下面的查询查看数据库中某些常见的等待事件:select * from v$system_eventwhere event in ('buffer busy waits','db file sequential read','db file scattered read','enqueue','free buffer waits','latch free','log file parallel write','log file sync');-- 接着,利用下面对v$session_event和v$session视图进行的查询,研究具有对上面显示的内容有贡献的等待事件的会话:selectse.sid,ername,se.event,se.total_waits,se.time_waited,se.average_w aitfrom v$session s,v$session_event sewhere s.sid = se.sidand se.event not like 'SQL*Net%'and s.status = 'ACTIVE'and ername is not null;-- 使用下面查询找到与所连接的会话有关的当前等待事件。

Oracle的性能优化

Oracle的性能优化

千里之行,始于足下。

Oracle的性能优化
Oracle的性能优化是提高数据库系统性能和响应速度的关键步骤,可以通
过如下几个方面进行优化:
1. 数据库设计和规范化:合理的数据库设计和良好的规范化可以减少数据冗余,提高查询效率,避免数据冲突和不一致。

2. 索引优化:在频繁查询的字段上创建适当的索引,可以加快查询速度。

但是,索引不宜过多,因为它们会增加数据修改和插入的时间。

3. 查询优化:优化查询语句的执行计划,使用正确的连接方法(如内连接、外连接),避免全表扫描。

4. 硬件升级:增加内存、硬盘和处理器等硬件资源,可以显著提高
Oracle数据库的性能。

5. 优化配置参数:根据数据库的特点和应用的需求,调整数据库的配置参数,例如SGA大小、PGA大小、日志文件大小等,以提高性能。

6. 数据库优化:使用合适的数据库特性,如分区表、分区索引、物化视图等,优化数据库的存储和查询效率。

7. 监控和调优:持续监控数据库的性能指标,如CPU利用率、内存使用率、磁盘IO等,并及时进行适当的调优操作。

第1页/共2页
锲而不舍,金石可镂。

总体来说,Oracle的性能优化需要综合考虑数据库设计、硬件配置、查询优化和系统监控等多个方面,通过不断的调整和优化,提高数据库的性能和响应速度。

Oracle数据库性能优化分析

Oracle数据库性能优化分析

Oracle数据库性能优化分析Oracle数据库性能优化是数据库管理中不可缺少的一部分。

要想让Oracle数据库运行得更快、更稳定,就需要进行性能优化。

这篇文章将从诊断问题、优化SQL查询、调整数据库参数等方面,介绍Oracle数据库性能优化的主要方法。

一、诊断问题在进行Oracle数据库性能优化之前,需要诊断问题,找出可能影响数据库性能的因素。

可以采用Oracle自带的一些工具,比如AWR(Automatic Workspace Repository)报告、ASH (Active Session History)数据等,来分析数据库的性能瓶颈。

AWR报告可以提供大量的信息,包括系统负载、等待事件、SQL执行统计等,这些信息可以帮助我们找出哪些SQL语句执行缓慢、哪些等待事件占用了过多的系统资源。

ASH数据则在AWR报告的基础上,提供了更为详细的会话信息。

我们可以通过对ASH数据的分析,了解每个会话的活动情况、等待事件及其统计信息等。

二、优化SQL查询优化SQL查询是Oracle数据库性能优化的重要步骤。

通过改写SQL查询、优化索引、统计信息等,来改善数据库的查询效率。

1. 改写SQL查询Oracle支持许多不同的SQL查询语句,而不同的查询语句的效率也是不同的。

比如,使用程序中嵌套的查询语句,可能会导致性能下降。

在这种情况下,可以使用联接查询来代替嵌套查询。

例如:SELECT *FROM departmentWHERE dept_id IN (SELECT dept_idFROM employeeWHERE emp_name = 'John');可以使用联接查询来代替上述嵌套查询:SELECT *FROM department, employeeWHERE department.dept_id = employee.dept_idAND employee.emp_name = 'John';2. 优化索引建立适当的索引是提高Oracle数据库性能的有效方法之一。

Oracle 数据库性能优化技术

Oracle 数据库性能优化技术

ORACLE数据库性能优化技术语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。

4、调整服务器内存分配。

内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。

需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。

5、调整硬盘I/O,这一步是在信息系统开发之前完成的。

数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。

6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。

实际上,上述数据库优化措施之间是相互联系的。

ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待。

但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。

另外,良好的数据库管理工具对于优化数据库性ORACLE数据库性能优化工具常用的数据库性能优化工具有:1、ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,2、操作系统工具,例如UNIX操作系统的vmstat,iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现在什么地方有时候很有用3、SQL语言跟踪工具(SQL TRACE FACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例,使用SQL语句跟踪文件调整应用程序性能。

SQL语言跟踪工具将结果输出成一个操作系统的文件,管理员可以使用TKPROF工具查看这些文件。

Oracle数据库性能优化概述

Oracle数据库性能优化概述

智慧ITOracle数据库性能优化概述技术创新,变革未来01性能优化方法概略02性能优化之登录目录03性能优化之资源Contents04性能优化之锁02性能优化探讨•原因:WHY为什么?•慢(响应时间)•慢(吞吐量)•就想做个优化02我们经常遇到的问题ClientNetworkOSDatabaseMiddle-wareApplicationH/W嘿!数据库出问题了!网络供应商数据库厂商中间件厂商应用开发商硬件供应商OS 供应商增加硬件可以解决问题•大家都在尽可能的推卸责任•甲方很难沟通和协调02性能优化要点数据库性能优化定位监控预警自动化运维平台基线监控数据库各个组件健康运行状态及时预警各类非正常的组件及指标自动化、标准化、内置专家系统建立各种性能基线(方便寻找变化),相当于一个健康人的体检指标性能问题典型特点为不报错,需在错综复杂的环境中快速定位故障要点:丰富的知识储备,可量化,可比较02性能问题常见原因性能问题症状前台业务很卡后台报表很慢历史数据积压调度不合理主机参数不合理硬件架构对象设计不合理执行计划异常全表扫描长长的串行逻辑硬件性能瓶颈Oracle bug高频SQL数据块争用Mutex 争用Lock 争用Latch 争用数据库参数不合理02诊断数据库性能的三把利剑:AWR,ASH,ADDM02系统极限a吞吐量到达突变之后,响应时间急剧上升。

b系统性能优化的目标就是让突变点尽可能后移。

02性能优化探讨CPU 资源内存资源I/O 资源网络资源主机的四大资源一直在更新换代02主机资源的三角关系内存资源运行队列等待队列上下文切换能力空闲率内存容量内存交换吞吐量IOPS 响应时间存储容量内存空闲I/O 空闲率02CPU资源快速发展:Intel志强E7与POWER8之争02I/O资源:闪存的快速发展延时2.5usec 1.3usec0.7usec<0.5usec 160/200Gb/s 100Gb/s 56Gb/s40Gb/s 10Gb/s 20Gb/s20012002200320042005200620072008200920102011201220132014201520162017200120022003200420052006200720082009201020112012201320142015201620175usec带宽Same Software Interface0.5usec02网络资源:IB 网络的快速发展故障现象:CPU资源空闲率严重不足,监控日志显示如下:故障现象:内存资源严重不足,系统产生大量交换。

oracle优化方案

oracle优化方案

oracle优化方案Oracle优化方案1. 引言Oracle数据库是一种常用的关系型数据库管理系统,广泛应用于企业级应用程序。

随着数据规模的增长和业务需求的提升,数据库优化成为提高系统性能和响应速度的关键要素之一。

本文将介绍一些常见的Oracle优化方案,帮助您优化数据库性能。

2. 查询优化查询是数据库最常用的操作之一,因此查询优化是数据库性能优化的重要组成部分。

2.1 创建索引索引可以加快查询的速度,特别是对于经常被查询的列。

通过使用CREATE INDEX语句可以创建索引,例如:```sqlCREATE INDEX idx_name ON table_name (column_name);```2.2 使用合适的查询语句使用合适的查询语句可以减少不必要的资源消耗。

避免使用SELECT * 来获取全部列的数据,只查询需要的字段。

另外,避免使用模糊查询(如使用LIKE ‘%value%’)和通配符查询,因为它们会导致全表扫描。

2.3 分析执行计划执行计划是Oracle数据库在查询过程中生成的优化器的一个输出结果,可以帮助我们理解查询过程中的资源消耗和性能瓶颈。

可以使用以下命令获取执行计划:```sqlEXPLAIN PLAN FOR [your_query];SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);```分析执行计划后,可以根据性能瓶颈进行优化。

3. 数据库配置优化在数据库配置的过程中,有一些参数可以调整以提高数据库的性能。

3.1 SGA设置SGA(System Global Area)是Oracle数据库中的一个关键组件,用于缓存数据和SQL 查询执行计划。

通过适当调整SGA的大小,可以提高数据库的性能。

以下是一些与SGA相关的参数:- DB_CACHE_SIZE:设置数据库缓冲区的大小,最大限度地利用内存。

- SHARED_POOL_SIZE:设置的共享池的大小,用于缓存SQL查询和执行计划。

Oracle性能究极优化(Oracle性能优化)

Oracle性能究极优化(Oracle性能优化)

Oracle性能究极优化(Oracle性能优化)原作者:Bert Scalzo⽬前,HP,Compaq,Dell,IBM 以及 Oracle 都在加快速度拥抱 Linux ,这个开放源码的操作系统。

根据 eWeek 的统计,去年 Linux 服务器的销售量⼤约占据了 Compaq 的 30%,Dell 的 13.7%,IBM 的 13.5%。

⽽且 IBM 2001年度在 Linux 上的投⼊有 10 个亿。

Intel 最新的 64 位的 Itanium CPU 只⽀持四种操作系统:Windows, Linux, AIX 和 HP-UX。

我们也不要忘记Oracle 的 9i 数据库 Linux 版本要⽐ Windows 版本早⼀个⽉。

尽管 Linux 能跑在从 IBM S/390 到 Sun SPARC 结构的服务器,但是对于⼤多数⼈来说,Intel 还是 Linux 跑得最多的平台。

本⽂就是要讲述通过简单的性能调正,使 Oracle 的性能提升 1000% 的办法。

本⽂采⽤的测试环境是⼀台 Compaq 4 CPU,512 MB ,8 部 7200 rpm SCSI 磁盘的服务器,然后在⼏乎同样的单 CPU Athlon 系统上作了测试,内存⼀样,但是只有⼀部 7200 rpm 的 Ultra 100 IDE 磁盘。

尽管最后的结果和得到的百分⽐不⼀样,但是观测得到的性能提升是⼀致的。

为了简单起见,我们的测试环境采⽤ TPC 基准测试,它⼴泛地⽤于 OLTP 的负荷测试。

Quest 公司有⼀个叫做 Benchmark Factory 的⼯具,使测试⼯作变得就像发送电⼦邮件⼀样简单。

下⾯我们将分别通过 DB 的调整和 OS 的调整来看测试的结果。

DB1 的初始化参数⼀般不常见,为了说明问题,我们使⽤这些参数并作为基准。

DB1: Initial DatabaseDatabase Block Size 2KSGA Buffer Cache 64MSGA Shared Pool 64MSGA Redo Cache 4MRedo Log Files 4MTablespaces DictionaryTPC Results Load Time (Seconds) 49.41Transactions / Second 8.152显然需要加⼤ SGA ⼤⼩,我们来看 DB2 的结果:DB2: Cache & PoolDatabase Block Size 2KSGA Buffer Cache 128MSGA Shared Pool 128MSGA Redo Cache 4MRedo Log Files 4MTablespaces DictionaryTPC Results Load Time (Seconds) 48.57Transactions / Second 9.147增⼤ SGA 已经缓冲看来对于性能的提升并不显著,加载时间只提升了 1.73%。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ORACLE SQL性能优化我要讲的题目是Oracle SQL性能优化,只是Oracle性能优化中的一项。

Oracle的性能优化包含很多方面,比如调整物理存取,调整逻辑存取,调整内存使用,减少网络流量等。

这里选择SQL性能优化是因为这部分内容我们测试人员最容易接触到,另外开发人员写SQL脚本时有时很随意,不知不觉就会造成程序性能上的下降。

1.选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.例如:表 TAB1 16,384 条记录表 TAB2 1 条记录选择TAB2作为基础表 (最好的方法)select count(*) from tab1,tab2 执行时间0.96秒选择TAB2作为基础表 (不佳的方法)select count(*) from tab2,tab1 执行时间26.09秒如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.例如:EMP表描述了LOCATION表和CATEGORY表的交集.SELECT *FROM LOCATION L , CATEGORY C, EMP EWHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCN将比下列SQL更有效率SELECT *FROM EMP E ,LOCATION L ,CATEGORY CWHERE E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCNAND E.EMP_NO BETWEEN 1000 AND 20002.WHERE子句中的连接顺序.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.例如:(低效,执行时间156.3秒)SELECT … FROM EMP EWHERE SAL > 50000 AND JOB = ‘MANAGER’AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);(高效,执行时间10.6秒)SELECT …FROM EMP EWHERE 25 < (SELECT COUNT(*) FROM EMPWHERE MGR=E.EMPNO)AND SAL > 50000AND JOB = ‘MANAGER’;3.SELECT子句中避免使用‘ * ‘当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用‘*’是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.4.减少访问数据库的次数当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量, 读数据块等等. 由此可见, 减少访问数据库的次数, 就能实际上减少ORACLE的工作量.例如,以下有三种方法可以检索出雇员号等于0342或0291的职员.方法1 (最低效)SELECT ENAME , SALFROM EMPWHERE EMPNO = 342;SELECT ENAME , SALFROM EMPWHERE EMPNO = 291;方法2 (次低效)DECLARECURSOR C2 (E_NO NUMBER) ISSELECT ENAME,SALFROM EMPWHERE EMPNO = E_NO;v1_EName emp.ename%TYPE;v1_Sal emp.sal%TYPE;v2_EName emp.ename%TYPE;v2_Sal emp.sal%TYPE;BEGINOPEN C2(342);FETCH C2 INTO v1_EName,v1_Sal;Close C2;OPEN C2(291);FETCH C2 INTO v2_EName,v2_Sal;CLOSE C2;END;./方法3 (高效)SELECT A.ENAME , A.SAL,B.ENAME , B.SALFROM EMP A,EMP BWHERE A.EMPNO = 342AND B.EMPNO = 291;5.使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.例如:SELECT COUNT(*),SUM(SAL)FROM EMPWHERE DEPT_NO = 0020AND ENAME LIKE…SMITH%‟;SELECT COUNT(*),SUM(SAL)FROM EMPWHERE DEPT_NO = 0030AND ENAME LIKE…SMITH%‟;你可以用DECODE函数高效地得到相同结果SELECT COUNT(DECODE(DEPT_NO,0020,‟X‟,NULL)) D0020_COUNT, COUN T(DECODE(DEPT_NO,0030,‟X‟,NULL)) D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SALFROM EMP WHERE ENAME LIKE …SMITH%‟;类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中. 6.整合简单,无关联的数据库访问如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)例如:SELECT NAMEFROM EMPWHERE EMP_NO = 1234;SELECT NAMEFROM DPTWHERE DPT_NO = 10 ;SELECT NAMEFROM CATWHERE CAT_TYPE = …RD‟;上面的3个查询可以被合并成一个:SELECT , , FROM CAT C , DPT D , EMP E,DUAL XWHERE NVL(…X‟,X.DUMMY) = NVL(…X‟,E.ROWID(+))AND NVL(…X‟,X.DUMMY) = NVL(…X‟,D.ROWID(+))AND NVL(…X‟,X.DUMMY) = NVL(…X‟,C.ROWID(+))AND E.EMP_NO(+) = 1234AND D.DEPT_NO(+) = 10AND C.CAT_TYPE(+) = …RD‟;虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以还是要权衡之间的利弊7.删除重复记录最高效的删除重复记录方法( 因为使用了ROWID)DELETE FROM EMP EWHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP XWHERE X.EMP_NO = E.EMP_NO);8.用TRUNCATE替代DELETE当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.(TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)9.尽量多使用COMMIT只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:a. 回滚段上用于恢复数据的信息.b. 被程序语句获得的锁c. redo log buffer 中的空间d. ORACLE为管理上述3种资源中的内部花费10.计算记录条数count(*)count(1)当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如COUNT(EMPNO)11.用Where子句替换HAVING子句避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.例如:低效:SELECT REGION,AVG(LOG_SIZE)FROM LOCATIONGROUP BY REGIONHAVING REGION != …SYDNEY‟AND REGION != …PERTH‟高效SELECT REGION,AVG(LOG_SIZE)FROM LOCATIONWHERE REGION REGION != ‘SYDNEY’AND REGIO N != ‘PERTH’GROUP BY REGION12.减少对表的查询在含有子查询的SQL语句中,要特别注意减少对表的查询.例如:低效SELECT TAB_NAMEFROM TABLESWHERE TAB_NAME = ( SELECT TAB_NAMEFROM TAB_COLUMNSWHERE VERSION = 604)AND DB_VER= ( SELECT DB_VERFROM TAB_COLUMNSWHERE VERSION = 604)高效SELECT TAB_NAMEFROM TABLESWHERE (TAB_NAME,DB_VER)= ( SELECT TAB_NAME,DB_VER)FROM TAB_COLUMNSWHERE VERSION = 604)Update 多个Column 例子:低效:UPDATE EMPSET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)WHERE EMP_DEPT = 0020;高效:UPDATE EMPSET (EMP_CAT, SAL_RANGE)= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)FROM EMP_CATEGORIES)WHERE EMP_DEPT = 0020;13.通过内部函数提高SQL效率.SELECTH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)FROM HISTORY_TYPE T,EMP E,EMP_HISTORY HWHERE H.EMPNO = E.EMPNOAND H.HIST_TYPE = T.HIST_TYPEGROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;通过调用下面的函数可以提高效率.FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2ASTDESC VARCHAR2(30);CURSOR C1 ISSELECT TYPE_DESCFROM HISTORY_TYPEWHERE HIST_TYPE = TYP;BEGINOPEN C1;FETCH C1 INTO TDESC;CLOSE C1;RETURN (NVL(TDESC,‟?‟));END;FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2 ASENAME VARCHAR2(30);CURSOR C1 ISSELECT ENAMEFROM EMPWHERE EMPNO=EMP;BEGINOPEN C1;FETCH C1 INTO ENAME;CLOSE C1;RETURN (NVL(ENAME,‟?‟));END;SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*) FROM EMP_HISTORY HGROUP BY H.EMPNO , H.HIST_TYPE;’能不能用一个SQL写出….’ 的问题, 复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的14.使用表的别名(Alias)当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.(Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属)15.用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.低效:SELECT *FROM EMP (基础表)WHERE EMPNO > 0AND DEPTNO IN (SELECT DEPTNOFROM DEPTWHERE LOC = …MELB‟)高效:SELECT *FROM EMP (基础表)WHERE EMPNO > 0AND EXISTS (SELECT …X‟FROM DEPTWHERE DEPT.DEPTNO = EMP.DEPTNOAND LOC = …MELB‟)16.用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.例如:SELECT …FROM EMPWHERE DEPT_NO NOT IN (SELECT DEPT_NOFROM DEPTWHE RE DEPT_CAT=‟A‟);为了提高效率.改写为:(方法一: 高效)SELECT ….FROM EMP A,DEPT BWHERE A.DEPT_NO = B.DEPT(+)AND B.DEPT_NO IS NULLAND B.DEPT_CAT(+) = …A‟(方法二: 最高效)SELECT ….FROM EMP EWHERE NOT EXISTS (SELECT …X‟FROM DEPT DWHERE D.DEPT_NO = E.DEPT_NOAND DEPT_CAT = …A‟);17.用表连接替换EXISTS通常来说, 采用表连接的方式比EXISTS更有效率SELECT ENAMEFROM EMP EWHERE EXISTS (SELECT …X‟FROM DEPTWHERE DEPT_NO = E.DEPT_NOAND DEPT_CAT = …A‟);(更高效)SELECT ENAMEFROM DEPT D,EMP EWHERE E.DEPT_NO = D.DEPT_NOAND DEPT_CAT = …A‟ ;18.用EXISTS替换DISTINCT当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换例如:低效:SELECT DISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D,EMP EWHERE D.DEPT_NO = E.DEPT_NO高效:SELECT DEPT_NO,DEPT_NAMEFROM DEPT DWHERE EXISTS ( SELECT …X‟FROM EMP EWHERE E.DEPT_NO = D.DEPT_NO);EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.19.用索引提高效率索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE 优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率.虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.定期的重构索引是有必要的.ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME> 20.强制索引失效如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) .举例:SELECT ENAMEFROM EMPWHERE EMPNO = 7935AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/AND EMP_TYPE || …‟ = …A‟ /*EMP_TYPE上的索引将失效*/这是一种相当直接的提高查询效率的办法. 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它.这里有一个例子关于何时采用这种策略,假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS 上没有索引.SELECT ENAMEFROM EMPWHERE EMP_TYPE = …A‟AND EMP_CLASS = …X‟;优化器会注意到EMP_TYPE上的索引并使用它. 这是目前唯一的选择. 如果,一段时间以后, 另一个非唯一性建立在EMP_CLASS上,优化器必须对两个索引进行选择,在通常情况下,优化器将使用两个索引并在他们的结果集合上执行排序及合并. 然而,如果其中一个索引(EMP_TYPE)接近于唯一性而另一个索引(EMP_CLASS)上有几千个重复的值. 排序及合并就会成为一种不必要的负担. 在这种情况下,你希望使优化器屏蔽掉EMP_CLASS索引.用下面的方案就可以解决问题.SELECT ENAMEFROM EMPWHERE EMP_TYPE = …A‟AND EMP_CLASS||’’= …X‟;21.避免在索引列上使用计算.WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.举例:低效:SELECT …FROM DEPTWHERE SAL * 12 > 25000;高效:SELECT …FROM DEPTWHERE SAL > 25000/12;这是一个非常实用的规则,请务必牢记22.自动选择索引如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.举例:SELECT ENAMEFROM EMPWHERE EMPNO = 2326AND DEPTNO = 20 ;这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录.TABLE ACCESS BY ROWID ON EMPINDEX UNIQUE SCAN ON EMP_NO_IDX23.避免在索引列上使用NOT通常,我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.举例:低效: (这里,不使用索引)SELECT …FROM DEPTWHERE DEPT_CODE NOT = 0;高效: (这里,使用了索引)SELECT …FROM DEPTWHERE DEPT_CODE > 0;需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符.NOT > to <=NOT >= to <NOT < to >=NOT <= to >24. 用>=替代>如果DEPTNO上有一个索引,高效:SELECT *FROM EMPWHERE DEPTNO >=4低效:SELECT *FROM EMPWHERE 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 , REGIONFROM LOCATIONWHERE LOC_ID = 10UNIONSELECT LOC_ID , LOC_DESC , REGIONFROM LOCATIONWHERE REGION = “MELBOURNE”低效:SELECT LOC_ID , LOC_DESC , REGIONFROM LOCATIONWHERE LOC_ID = 10 OR REGION = “MELBOURNE”如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.26.用IN来替换OR下面的查询可以被更有效率的语句替换:低效:SELECT….FROM LOCATIONWHERE LOC_ID = 10OR LOC_ID = 20OR LOC_ID = 30高效SELECT…FROM LOCATIONWHERE LOC_IN IN (10,20,30);27.避免在索引列上使用IS NULL和IS NOTNULL避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中.举例:如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000条具有相同键值的记录,当然它们都是空!因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.举例:低效: (索引失效)SELECT …FROM DEPARTMENTWHERE DEPT_CODE IS NOT NULL;高效: (索引有效)SELECT …FROM DEPARTMENTWHERE DEPT_CODE >=0;28.总是使用索引的第一个列如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.这也是一条简单而重要的规则. 见以下实例.SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));Table created.SQL> create index multindex on multiindexusage(inda,indb);Index created.SQL> set autotrace traceonlySQL> select * from multiindexusage where inda = 1;Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 TABLE ACCESS (BY INDEX ROWID) OF'MULTIINDEXUSAGE'2 1 INDEX (RANGE SCAN) OF 'MULTINDEX'(NON-UNIQUE)SQL> select * from multiindexusage where indb = 1;Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引29.用UNION-ALL 替换UNION ( 如果有可能的话)当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.举例:低效:SELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONSWHERE TRAN_DATE = ‟31-DEC-95‟UNIONSELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONSWHERE TRAN_DATE = ‟31-DEC-95‟高效:SELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONSWHERE TRAN_DATE = ‟31-DEC-95‟UNION ALLSELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONSWHERE TRAN_DATE = ‟31-DEC-95‟需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性.30.用WHERE替代ORDER BYORDER BY 子句只在两种严格的条件下使用索引.1.ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.2.ORDER BY中所有的列必须定义为非空.WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.例如:表DEPT包含以下列:DEPT_CODE PK NOT NULLDEPT_DESC NOT NULLDEPT_TYPE NULL非唯一性的索引(DEPT_TYPE)低效: (索引不被使用)SELECT DEPT_CODEFROM DEPTORDER BY DEPT_TYPE高效: (使用索引)SELECT DEPT_CODEFROM DEPTWHERE DEPT_TYPE > 031.避免改变索引列的类型.当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.假设EMPNO是一个数值类型的索引列.SELECT …FROM EMPWHERE EMPNO = …123‟实际上,经过ORACLE类型转换, 语句转化为:SELECT …FROM EMPWHERE EMPNO = TO_NUMBER(…123‟)幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.现在,假设EMP_TYPE是一个字符类型的索引列.SELECT …FROM EMPWHERE EMP_TYPE = 123这个语句被ORACLE转换为:SELECT …FROM EMPWHERE TO_NUMBER(EMP_TYPE)=123因为内部发生的类型转换, 这个索引将不会被用到!为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型.32.需要当心的WHERE子句某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.在下面的例子里, …!=‟ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.不使用索引:SELECT ACCOUNT_NAMEFROM TRANSACTIONWHERE AMOUNT !=0;使用索引:SELECT ACCOUNT_NAMEFROM TRANSACTIONWHERE AMOUNT >0;下面的例子中, …||‟是字符连接函数. 就象其他函数那样, 停用了索引.不使用索引:SELECT ACCOUNT_NAME,AMOUNTFROM TRANSACTIONWHERE ACCOUNT_NAME||ACCOUNT_TYPE=‟AMEXA‟;使用索引:SELECT ACCOUNT_NAME,AMOUNTFROM TRANSACTIONWHERE ACCOUNT_NAME = …AMEX‟AND ACCOUNT_TYPE=‟ A‟;下面的例子中, …+‟是数学函数. 就象其他数学函数那样, 停用了索引.不使用索引:SELECT ACCOUNT_NAME, AMOUNTFROM TRANSACTIONWHERE AMOUNT + 3000 >5000;使用索引:SELECT ACCOUNT_NAME, AMOUNTFROM TRANSACTIONWHERE AMOUNT > 2000 ;下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.不使用索引:SELECT ACCOUNT_NAME, AMOUNTFROM TRANSACTIONWHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);使用索引:SELECT ACCOUNT_NAME, AMOUNTFROM TRANSACTIONWHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,‟%‟);如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的索引(Function-Based Index) 也许是一个较好的方案.CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*将使用索引*/33.优化GROUP BY提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.低效:SELECT JOB , AVG(SAL)FROM EMPGROUP JOBHAVING JOB = …PRESIDENT‟OR JOB = …MANAGER‟高效:SELECT JOB , AVG(SAL)FROM EMPWHERE JOB = …PRESIDENT‟OR JOB = …MANAGER‟GROUP JOB34.分离表和索引总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上.。

相关文档
最新文档