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. SGA参数优化:- 调整sga_target参数以控制SGA的大小。

SGA包括数据库缓冲区、共享池、重做日志缓冲区等,适当调整SGA的大小可以减少IO操作,提高数据库性能。

- 调整db_cache_size参数以增大数据库缓冲区的大小,提高数据块的访问速度。

- 调整shared_pool_size参数以增大共享池的大小,提高SQL语句的解析和执行效率。

2. PGA参数优化:- 调整pga_aggregate_target参数以控制PGA的大小。

PGA是用于处理SQL查询和排序的内存区域,适当调整PGA的大小可以减少磁盘IO操作,提高查询和排序的性能。

3. Redo日志参数优化:- 调整log_buffer参数以增大重做日志缓冲区的大小,减少频繁的重做日志刷新操作,提高数据库的写入性能。

- 调整log_checkpoint_timeout参数以控制重做日志刷新的频率,避免过于频繁的刷新。

4. 并行处理参数优化:- 调整parallel_max_servers参数以增大并行处理的资源限制,提高并行查询和并行DML操作的性能。

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

- 调整parallel_min_servers参数以设置最小的并行处理资源数,避免并行操作的启动延迟。

5. SQL优化:- 使用合适的索引和优化的SQL语句,优化查询的执行计划。

- 使用绑定变量而不是直接将参数传递到SQL语句中,避免SQL重解析,提高性能。

6. 服务器参数优化:- 调整processes参数以增加数据库的并发连接数。

- 调整sessions参数以控制数据库的最大会话数。

- 调整open_cursors参数以增大打开游标的数量,避免游标溢出。

以上是一些常见的Oracle数据库参数优化技巧,但具体的优化策略需要根据实际情况进行调整,可以参考Oracle官方文档和专业的DBA建议。

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性能优化面试题一、概述Oracle性能优化是数据库管理中的重要环节,通过合理的调整和优化,可以提升数据库的运行效率和响应速度,提高系统的稳定性和可用性。

在面试中,常常会涉及到Oracle性能优化相关的问题,下面是一些常见的Oracle性能优化面试题。

二、索引优化1. 请说明什么是索引?索引是一种特殊的数据库对象,它能够加快数据库的查询速度。

索引由一个或多个列组成,它们的值会按照一定的顺序进行排序,并建立索引数据结构以支持快速查找。

2. 如何确定何时创建索引?创建索引需要权衡查询的速度和更新的效率。

一般来说,当查询的频率远远大于更新的频率时,可以考虑创建索引。

同时也需要考虑查询的字段是否经常被使用,以及查询的覆盖度等因素。

3. 请说明常见的索引类型?常见的索引类型包括唯一索引、非唯一索引、主键索引、聚簇索引和非聚簇索引等。

4. 如何选择合适的索引?选择合适的索引需要考虑查询的频率、更新的频率、查询的覆盖度等因素。

同时还需要考虑索引的大小以及对于查询的影响。

三、SQL优化1. 请说明常见的SQL调优手段?常见的SQL调优手段包括使用合适的索引、优化SQL语句的写法、使用合适的连接方式、减少数据库的访问次数等。

2. 如何使用执行计划进行SQL优化?执行计划是Oracle数据库为了优化查询语句而生成的查询执行计划,其中包含了查询的操作步骤、连接方式、访问路径等信息。

可以通过查看执行计划来判断查询是否需要进行优化,并通过优化查询的方式来提升性能。

3. 如何优化大表查询?优化大表查询可以通过分页查询、增加条件过滤、创建合适的索引等方式来进行。

同时也可以考虑对大表进行分区或者分表的方式来提高查询效率。

四、资源优化1. 如何优化内存资源?优化内存资源可以通过调整SGA和PGA的大小来实现。

SGA包括共享池、数据库缓存和重做日志缓冲等,可以通过调整参数来合理分配内存。

PGA是为每个会话分配的私有内存区域,可以通过调整PGA_AGGREGATE_TARGET参数来优化。

34种Oracle性能优化的方法

34种Oracle性能优化的方法

34种Oracle性能优化的方法1、选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.2、WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.3、SELECT子句中避免使用‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间4、减少访问数据库的次数:ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;5、在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE 参数, 可以增加每次数据库访问的检索数据量 ,建议值为2006、使用DECODE函数来减少处理时间:使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.7、整合简单,无关联的数据库访问:如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)8、删除重复记录:最高效的删除重复记录方法 ( 因为使用了ROWID)例子:DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);9、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)10、尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:a. 回滚段上用于恢复数据的信息.b. 被程序语句获得的锁c. redo log buffer 中的空间d. ORACLE为管理上述3种资源中的内部花费11、用Where子句替换HAVING子句:避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。

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数据库优化是提高数据库性能的关键步骤,可以采取多种策略。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Oracle数据库性能优化与案例分析
技术创新,变革未来
Oracle数据库性能优化与案例分析
性能优化探讨
• 原因:为什么? • 慢(响应时间) • 慢(吞吐量)
性能优化探讨
• 目的:为了什么? • 快(响应时间) • 快(吞吐量)
性能优化之案例分析
• 案例之方法论 • 案例之登录访问 • 案例之资源 • 案例之锁
性能优化方法论发展
• 登录输入指标测量 • Logons:= EndSnap. logons cumulative– StartSnap. logons
cumulative。 • Logons Per Second:= Logons / TimeInterval
案例之登录访问
登录输出指标测量:
Logon Response Time:= Network Response Time * 10 + Native TCP Logon :=Network Response Time * 10 + Listener Response Time + Native IPC Logon Time 。
案例之登录访问
• 例:

某医院HIS业务系统的账户登录操作异常缓慢,部分情况下
甚至会出现长时间的卡壳情况,业务影响主要发生在每天早上
的上班时刻。
案例之登录访问
优化过程: • 账户登录过程一般涉及到在账户表格以及对应日志表格上的冲
突,比如Buffer busy waits或者TX lock。AWR未体现该特征。 • AWR报告显示connection management call elapsed time时间偏长
成功率:98% 高 失败率:2% 低
失败人数:500*2%=10

oracle优化原则和方法

oracle优化原则和方法

在oracle数据库管理中,优化是最重要的一项,也是最基础的一项。

oracle优化是为了改善数据库访问性能,使其更加高效。

要进行优化,就需要正确的方法和原则,下面介绍oracle优化的一些原则和方法。

一、优化原则1.应限制数据库大小,减少数据库扩充带来的影响,进而节省存储空间;2.应注重数据库索引结构优化,引起合理分类,改善搜索效率;3.应使用合理的逻辑结构,使得访问表时,扫描表行越少越高;4.应尽量避免使用全表扫描,从而提高数据处理速度;5.应尽量避免在数据库中使用触发器或存储过程,以免增加不必要的开销;6.应注重事务处理,尽量避免使用长事务;7.应尽量减少事务完成时间,避免不必要的资源锁定;8.应使用合理的架构逻辑结构,避免将多个大表同时加载到内存中;9.应限制数据库连接数,减少用户的等待时间和系统的负荷;10.应尽可能用正确的方式和有效的技术来优化系统。

二、优化方法1.创建索引:创建正确的索引对于提高oracle数据库的性能非常重要。

创建索引时,要考虑建立索引应包括的列和索引的类型;2.优化SQL语句:通过修改或优化SQL语句,可以使oracle数据库更加高效;3.改善数据库可用性:通过合理的备份与恢复措施,以及采用定期维护慢查询SQL和检查数据的一致性等技术,可以改善数据库的可用性;4.监控调优:可以通过oracle数据库定期监控功能,监控各种资源消耗情况,并深入分析SQL表达式,进行针对性的优化;5.定期重建表和索引:定期重建表和索引,能够使oracle数据库性能得到改善;6.合理分区:oracle数据库中用到分区表来改进query语句执行速度,减少用户的时间等待;以上是oracle优化的原则和方法,以改善oracle数据库的性能,。

Oracle数据库性能优化考试

Oracle数据库性能优化考试

Oracle数据库性能优化考试(答案见尾页)一、选择题1. Oracle数据库性能优化中,哪种方法可以用来分析SQL语句的性能?A. 使用EXPLAIN计划B. 使用SQL Trace工具C. 使用Automatic Workload Repository (AWR)D. 使用Real-Time Monitor (RTM)2. 在Oracle数据库中,如何调整初始化参数以提高查询性能?A. 调整UNDO表空间的大小B. 调整Redo日志文件的大小C. 调整SGA的大小D. 调整PGA的大小3. 在Oracle数据库中,哪种分区策略可以用来提高查询性能?A. 分区索引B. 哈希分区C.范围分区D. 列表分区4. Oracle数据库中的序列是什么?它有什么作用?A. 序列是一组数字,用于生成唯一值B. 序列是Oracle数据库中的一种数据对象,用于生成唯一值C. 序列可以用于生成主键值D. 序列可以用于限制查询结果的数量5. 在Oracle数据库中,如何使用SQLLoader工具将外部文件中的数据导入数据库?A. 使用BULK COLLECT和FORALL语法B. 使用OPEN和FETCH语法C. 使用COPY和PUMP语法D. 使用GET和PUT语法6. 在Oracle数据库中,如何使用保留锁来保护数据一致性和完整性?A. 使用GRANT和REVOKE语句B. 使用ALTER TABLE语句C. 使用LOCK TABLES和UNLOCK TABLES语句D. 使用ROWID和DBMS_ROWID包7. 在Oracle数据库中,如何使用SQL Developer工具进行性能调试?A. 使用SQL*Plus工具B. 使用JDBC连接C. 使用SQL Developer的Performance ToolsD. 使用SQL Developer的调试器8. 在Oracle数据库中,如何优化分页查询的性能?A. 使用LIMIT子句B. 使用ROW_NUMBER()窗口函数C. 使用ORDER BY子句D. 使用GROUP BY子句9. 在Oracle数据库中,如何调整内存相关的参数以提高数据库性能?A. 调整SHARED_POOL_SIZE参数B. 调整SESSIONS_PER_USER参数C. 调整CPU_COUNT参数D. 调整NETWORKS配置10. 在Oracle数据库中,如何使用STATISTICS_LEVEL参数来控制统计信息的收集?A. 设置为ALLB. 设置为TYPICALC. 设置为BasicD. 不设置此参数11. 在Oracle数据库中,如何调整索引以提高查询性能?A. 创建复合索引B. 删除不必要的索引C. 禁用索引D. 使用Index Organized Tables (IOTs)12. Oracle数据库中的AWR报告提供了关于哪些组件的性能信息的?A. SQL语句B. 索引C. 表D. 磁盘I/O13. 在Oracle数据库中,如何使用SQL调优工具来分析SQL性能?A. 使用SQL TraceB. 使用Automatic Workload Repository (AWR)C. 使用SQL Performance AnalyzerD. 使用Explain Plan14. 在Oracle数据库中,如何调整内存参数以提高性能?A. 调整SGA大小B. 调整PGA大小C. 调整Redo日志文件大小D. 调整数据文件大小15. 在Oracle数据库中,如何使用DBMS_OUTPUT.PUT_LINE包来输出性能数据?A. 调用函数时直接使用DBMS_OUTPUT.PUT_LINEB. 创建一个PL/SQL过程来输出性能数据C. 使用SQL*Plus的PUT_LINE函数D. 使用Utl相传入输出16. 在Oracle数据库中,如何使用保留实例(Real Application Clusters, RAC)来提高性能?A. 配置共享服务器模式B. 配置专用服务器模式C. 配置锁内存参数D. 配置网络配置17. 在Oracle数据库中,如何使用外部脚本或程序来分析性能问题?A. 使用SQL*Loader工具B. 使用UTL_FILE包来读取外部文件C. 使用外部脚本或程序来执行性能分析D. 使用ORADEBUG命令行工具18. 在Oracle数据库中,如何调整备份和恢复策略以提高性能?A. 更改备份频率B. 减少备份的数据量C. 启用归档模式D. 优化恢复过程19. Oracle数据库性能优化中,哪项不是使用索引的目的?A. 加速查询速度B. 提高数据检索效率C. 减少I/O操作D. 增加数据库系统的复杂性20. 在Oracle数据库中,哪种类型的索引可以加速查询速度,并且减少I/O操作?A. 单索引B. 复合索引C. 局部索引D. 全局索引21. Oracle数据库中的分区策略可以用于处理哪种类型的数据?A. 大型数据集B. 小型数据集C. 高并发访问D. 数据库备份和恢复22. 在Oracle数据库中,哪项不是使用归档日志的目的?A. 提供备份和恢复功能B. 减少磁盘空间占用C. 支持读写分离架构D. 保证数据的一致性23. Oracle数据库中的表空间是用来存储哪种类型的对象?A. 索引B. 表C. 视图D. 序列24. 在Oracle数据库中,哪项不是使用联机重做日志的目的?A. 提高数据保护B. 支持故障恢复C. 记录数据更改D. 减轻数据库负载25. Oracle数据库中的锁定机制主要防止哪种类型的并发问题?A. 并发插入B. 并发更新C. 并发删除D. 并发读取26. 在Oracle数据库中,哪项不是使用分区表的优点?A. 提高查询性能B. 改善数据分布C. 增强数据管理灵活性D. 减少数据冗余27. Oracle数据库中的数据压缩技术可以用于减少哪种类型的存储成本?A. 空间B. 时间C. 资源D. 硬件28. 在Oracle数据库中,哪项不是使用数据库实例调整来提高性能的方法?A. 调整内存分配B. 调整CPU分配C. 调整网络配置D. 调整表空间大小29. Oracle数据库性能优化中,如何调整初始化参数以提高数据库性能?A. 调整UNDO表空间大小B. 调整Redo日志文件大小C. 调整数据文件的大小D. 调整表空间的读写比例30. 在Oracle数据库中,为了提高查询性能,应该:A. 创建索引B. 维护统计信息C. 优化SQL查询D. A和C31. Oracle数据库中的锁有几种类型?A. 1种B. 2种C. 3种D. 4种32. Oracle数据库中的归档模式对性能有何影响?A. 影响数据恢复B. 影响数据备份和恢复C. 影响数据库性能D. 没有任何影响33. 在Oracle数据库中,如何减少临时表的使用?A. 使用物化视图B. 使用临时表C. 优化SQL查询D. A和C34. 在Oracle数据库中,如何调整SQL执行计划?A. 使用 Explain PlanB. 使用SQL Trace工具C. 调整初始化参数D. A和B35. 在Oracle数据库中,如何优化大型查询的性能?A. 使用索引B. 分区C. 规范化数据D. A和B36. 在Oracle数据库中,如何处理慢查询?A. 定期检查慢查询日志B. 使用自动共享内存管理C. 优化SQL语句D. A和B和C37. 在Oracle数据库中,如何提高数据导入导出性能?A. 使用SQL*Loader工具B. 使用外部表C. 使用并行处理D. A和B38. Oracle数据库性能优化中,哪种方法可以用来收集和分析查询性能相关的信息?A. 使用TKPROF工具B. 执行SQL脚本C. 使用Automatic Workload Repository (AWR)D. 监控系统日志39. 在Oracle数据库中,为了提高查询性能,以下哪个策略不是常用的方法?A. 为经常访问的列创建索引B. 使用物化视图C. 优化SQL查询语句D. 增加数据库缓冲区大小40. Oracle数据库中的SGA(System Global Area)主要包括哪些组成部分?A. 数据库缓冲区(Database Buffer Cache)B. 重做日志缓冲区(Redo Log Buffer)C. 共享池(Shared Pool)D. 大小沟槽(Large Objects)41. 在Oracle数据库中,如何调整初始化参数以提高数据库性能?A. 使用ALTER SYSTEM命令B. 使用ALTER SESSION命令C. 使用TXN_TIMEOUT初始化参数D. 使用SESSIONS_PER_USER初始化参数42. 在Oracle数据库中,哪种分区策略通常用于大型数据仓库?A. 范围分区B. 列表分区C. 组合分区D. 复杂分区43. 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数据库的性能优化问题Oracle数据库是一款流行的企业级数据库软件,但其性能优化问题也是不可避免的。

在实际应用中,如果Oracle数据库出现性能问题,将有严重的影响和损失。

因此,本文将讨论如何优化Oracle数据库的性能问题。

首先,针对Oracle数据库的性能瓶颈,可以通过调整数据库参数来提高性能。

Oracle数据库有很多参数可以配置,例如,缓存区大小、连接数、内存分配等。

通过针对不同的应用场景调整不同的参数配置,可以最大化地利用数据库的性能。

其次,针对SQL的性能问题,可以通过改进SQL语句来提高性能。

SQL优化是一项复杂的工作,但可以通过分析SQL执行计划来发现性能瓶颈,例如,缺乏索引、大表连接、高开销的子查询等。

并可以通过添加索引、优化查询语句等方式来提高数据库的性能。

除此之外,还可以通过加强硬件设备等方面来提升数据库性能。

例如,扩展数据库服务器的内存和硬盘容量,可以提高数据库的读写速度。

而使用高速网络设备如IB网络和10/100G以太网设备等,也可提高数据库的数据传输速度。

此外,Oracle数据库的性能优化也需要管理进程的支持与配合。

例如,数据库管理员需要监控数据库服务器硬件和软件性能,例如Oracle数据库的内部锁、等待事件、I/O活动等等。

在监控到性能问题后,需要在业务空档期进行优化,如调整SQL语句、更改数据库参数等。

总之,提高Oracle数据库的性能需要全面考虑软硬件配置、SQL语句等多个方面的因素。

通过合理的参数配置、SQL优化和硬件支持等方式,可以优化数据库的性能,提高应用的稳定性和响应速度。

ORACLE 性能优化系列

ORACLE 性能优化系列

ORACLE SQL性能优化系列关键字ORA CEL SQL Performance tuning出处1. 选用适合的ORACLE优化器ORACLE的优化器共有3种:a. RULE (基于规则)b. COST (基于成本)c. CHOOSE (选择性)设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖.为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性.如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器.在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.2. 访问Table的方式ORACLE 采用两种访问表中记录的方式:a. 全表扫描全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.b. 通过ROWID访问表你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.3. 共享SQL语句为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用.可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询.数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了.当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等).共享的语句必须满足三个条件:A. 字符级的比较:当前被执行的语句和共享池中的语句必须完全相同. 例如:SELECT * FROM EMP;和下列每一个都不同SELECT * from EMP;Select * From Emp;SELECT * FROM EMP;B. 两个语句所指的对象必须完全相同:例如:用户对象名如何访问Jack sal_limit private synonymWork_city public synonymPlant_detail public synonymJill sal_limit private synonymWork_city public synonymPlant_detail table owner考虑一下下列SQL语句能否在这两个用户之间共享.SQL能否共享原因select max(sal_cap) from sal_limit;不能每个用户都有一个private synonym - sal_limit , 它们是不同的对象select count(*0 from work_city where sdesc like 'NEW%';能两个用户访问相同的对象public synonym - work_cityselect a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id不能用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)例如:第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)a.select pin , name from people where pin = :blk1.pin;select pin , name from people where pin = :blk1.pin;b.select pin , name from people where pin = :blk1.ot_ind;select pin , name from people where pin = :blk1.ov_ind;4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)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表描述了LOCA TION表和CA TEGORY表的交集.SELECT *FROM LOCA TION L ,CA TEGORY C,EMP EWHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CA T_NO = C.CA T_NOAND E.LOCN = L.LOCN将比下列SQL更有效率SELECT *FROM EMP E ,LOCA TION L ,CA TEGORY CWHERE E.CA T_NO = C.CA T_NOAND E.LOCN = L.LOCNAND E.EMP_NO BETWEEN 1000 AND 20005.WHERE子句中的连接顺序.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.例如:(低效,执行时间156.3秒)SELECT …FROM EMP EWHERE SAL > 50000AND JOB = …MANAGER‟AND 25 < (SELECT COUNT(*) FROM EMPWHERE MGR=E.EMPNO);(高效,执行时间10.6秒)SELECT …FROM EMP EWHERE 25 < (SELECT COUNT(*) FROM EMPWHERE MGR=E.EMPNO)AND SAL > 50000AND JOB = …MANAGER‟;6. SELECT子句中避免使用… * …当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用…*‟ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将‟*‟ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.7.减少访问数据库的次数当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量, 读数据块等等. 由此可见, 减少访问数据库的次数, 就能实际上减少ORACLE的工作量.例如,以下有三种方法可以检索出雇员号等于0342或0291的职员.方法1 (最低效)SELECT EMP_NAME , SALARY , GRADEFROM EMPWHERE EMP_NO = 342;SELECT EMP_NAME , SALARY , GRADEFROM EMPWHERE EMP_NO = 291;方法2 (次低效)DECLARECURSOR C1 (E_NO NUMBER) ISSELECT EMP_NAME,SALARY,GRADEFROM EMPWHERE EMP_NO = E_NO;BEGINOPEN C1(342);FETCH C1 INTO …,..,.. ;…..OPEN C1(291);FETCH C1 INTO …,..,.. ;CLOSE C1;END;方法3 (高效)SELECT A.EMP_NAME , A.SALARY , A.GRADE,B.EMP_NAME , B.SALARY , B.GRADEFROM EMP A,EMP BWHERE A.EMP_NO = 342AND B.EMP_NO = 291;注意:在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量,建议值为2008.使用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,COUNT(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子句中.9.整合简单,无关联的数据库访问如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)例如:SELECT NAMEFROM EMPWHERE EMP_NO = 1234;SELECT NAMEFROM DPTWHERE DPT_NO = 10 ;SELECT NAMEFROM CA TWHERE CA T_TYPE = …RD‟;上面的3个查询可以被合并成一个:SELECT , , FROM CA T 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.CA T_TYPE(+) = …RD‟;(译者按: 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者还是要权衡之间的利弊)10.删除重复记录最高效的删除重复记录方法( 因为使用了ROWID)DELETE FROM EMP EWHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP XWHERE X.EMP_NO = E.EMP_NO);11.用TRUNCATE替代DELETE当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)而当运用TRUNCA TE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.(译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)12.尽量多使用COMMIT只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:a.回滚段上用于恢复数据的信息.b.被程序语句获得的锁c.redo log buffer 中的空间d.ORACLE为管理上述3种资源中的内部花费(译者按: 在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)13.计算记录条数和一般的观点相反, count(*) 比count(1)稍快, 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如COUNT(EMPNO)(译者按: 在CSDN论坛中,曾经对此有过相当热烈的讨论, 作者的观点并不十分准确,通过实际的测试,上述三种方法并没有显著的性能差别)14.用Where子句替换HA VING子句避免使用HA VING子句, HA VING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.例如:低效:SELECT REGION,A VG(LOG_SIZE)FROM LOCA TIONGROUP BY REGIONHA VING REGION REGION != …SYDNEY‟AND REGION != …PERTH‟高效SELECT REGION,A VG(LOG_SIZE)FROM LOCA TIONWHERE REGION REGION != …SYDNEY‟AND REGION != …PERTH‟GROUP BY REGION(译者按: HA VING中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中)15.减少对表的查询在含有子查询的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 例子:低效:UPDA TE EMPSET EMP_CA T = (SELECT MAX(CA TEGORY) FROM EMP_CA TEGORIES), SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CA TEGORIES) WHERE EMP_DEPT = 0020;高效:UPDA TE EMPSET (EMP_CA T, SAL_RANGE)= (SELECT MAX(CA TEGORY) , MAX(SAL_RANGE)FROM EMP_CA TEGORIES)WHERE EMP_DEPT = 0020;16.通过内部函数提高SQL效率.SELECT H.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 V ARCHAR2 ASTDESC V ARCHAR2(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 VARCHAR2ASENAME V ARCHAR2(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往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的)17.使用表的别名(Alias)当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.(译者注: Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属)18.用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‟)(译者按: 相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率,下一节中将指出)19.用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.例如:SELECT …FROM EMPWHERE DEPT_NO NOT IN (SELECT DEPT_NOFROM DEPTWHERE DEPT_CA T=‟A‟);为了提高效率.改写为:(方法一: 高效)SELECT ….FROM EMP A,DEPT BWHERE A.DEPT_NO = B.DEPT(+)AND B.DEPT_NO IS NULLAND B.DEPT_CA T(+) = …A‟(方法二: 最高效)SELECT ….FROM EMP EWHERE NOT EXISTS (SELECT …X‟FROM DEPT DWHERE D.DEPT_NO = E.DEPT_NOAND DEPT_CA T = …A‟);20.用表连接替换EXISTS通常来说, 采用表连接的方式比EXISTS更有效率SELECT ENAMEFROM EMP EWHERE EXISTS (SELECT …X‟FROM DEPTWHERE DEPT_NO = E.DEPT_NOAND DEPT_CA T = …A‟);(更高效)SELECT ENAMEFROM DEPT D,EMP EWHERE E.DEPT_NO = D.DEPT_NOAND DEPT_CA T = …A‟ ;(译者按: 在RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP)21.用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核心模块将在子查询的条件一旦满足后,立刻返回结果.22.识别‟低效执行‟的SQL语句用下列SQL工具找出低效SQL:SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,SQL_TEXTFROM V$SQLAREAWHERE EXECUTIONS>0AND BUFFER_GETS > 0AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8ORDER BY 4 DESC;(译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)23.使用TKPROF 工具来查询SQL性能状态SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化你的系统.设置SQL TRACE在会话级别: 有效ALTER SESSION SET SQL_TRACE TRUE设置SQL TRACE 在整个数据库有效仿, 你必须将SQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数说明了生成跟踪文件的目录(译者按: 这一节中,作者并没有提到TKPROF的用法, 对SQL TRACE的用法也不够准确, 设置SQL TRACE首先要在init.ora中设定TIMED_STATISTICS, 这样才能得到那些重要的时间状态. 生成的trace文件是不可读的,所以要用TKPROF工具对其进行转换,TKPROF 有许多执行参数. 大家可以参考ORACLE手册来了解具体的配置. )24.用EXPLAIN PLAN 分析SQL语句EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行.NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理.译者按:通过实践, 感到还是用SQLPLUS中的SET TRACE 功能比较方便.举例:SQL> list1 SELECT *2 FROM dept, emp3* WHERE emp.deptno = dept.deptnoSQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/SQL> /14 rows selected.Execution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 NESTED LOOPS2 1 T ABLE ACCESS (FULL) OF 'EMP'3 1 T ABLE ACCESS (BY INDEX ROWID) OF 'DEPT'4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)Statistics----------------------------------------------------------0 recursive calls2 db block gets30 consistent gets0 physical reads0 redo size2598 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)14 rows processed通过以上分析,可以得出实际的执行步骤是:1.T ABLE ACCESS (FULL) OF 'EMP'2.INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)3.T ABLE ACCESS (BY INDEX ROWID) OF 'DEPT'4.NESTED LOOPS (JOINING 1 AND 3)注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze 都提供了极其方便的EXPLAIN PLAN工具.也许喜欢图形化界面的朋友们可以选用它们.(待续)25.用索引提高效率索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.除了那些LONG或LONG RA W数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率.虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDA TE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.译者按:定期的重构索引是有必要的.ALTER INDEX <INDEXNAME> REBUILD <T ABLESPACENAME>26.索引的操作ORACLE对索引有两种访问模式.索引唯一扫描( INDEX UNIQUE SCAN)大多数情况下, 优化器通过WHERE子句访问INDEX.例如:表LODGING有两个索引: 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.SELECT *FROM LODGINGWHERE LODGING = …ROSE HILL‟;在内部, 上述SQL将被分成两步执行, 首先, LODGING_PK 索引将通过索引唯一扫描的方式被访问, 获得相对应的ROWID, 通过ROWID访问表的方式执行下一步检索.如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通过ROWID 访问表). 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询结果.下面SQL只需要INDEX UNIQUE SCAN 操作.SELECT LODGINGFROM LODGINGWHERE LODGING = …ROSE HILL‟;索引范围查询(INDEX RANGE SCAN)适用于两种情况:1.基于一个范围的检索2.基于非唯一性索引的检索例1:SELECT LODGINGFROM LODGINGWHERE LOD GING LIKE …M%‟;WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描低一些.例2:SELECT LODGINGFROM LODGINGWHERE MANAGER = …BILL GA TES‟;这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值. 由于LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描.由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作.WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用.SELECT LODGINGFROM LODGINGWHERE MANAGER LIKE …%HAN MAN‟;在这种情况下,ORACLE将使用全表扫描.27.基础表的选择基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的.如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径.如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的连接条件都有索引对应, 在这种情况下, 基础表就是FROM 子句中列在最后的那个表.举例:SELECT , B.MANAGERFROM WORKER A,LODGING BWHERE A.LODGING = B.LODING;由于LODGING表的LODING列上有一个索引, 而且WORKER表中没有相比较的索引,WORKER表将被作为查询中的基础表.28.多个平等的索引当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录.在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有当WHERE子句中索引列和常量比较才有效.如果索引列和其他表的索引类相比较. 这种子句在优化器中的等级是非常低的.如果不同表中两个想同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率先使用. FROM子句中最后的表的索引将有最高的优先级.如果相同表中两个想同等级的索引将被引用, WHERE子句中最先被引用的索引将有最高的优先级.举例:DEPTNO上有一个非唯一性索引,EMP_CA T也有一个非唯一性索引.SELECT ENAME,FROM EMPWHERE DEPT_NO = 20AND EMP_CA T = …A‟;这里,DEPTNO索引将被最先检索,然后同EMP_CA T索引检索出的记录进行合并. 执行路径如下:TABLE ACCESS BY ROWID ON EMPAND-EQUALINDEX RANGE SCAN ON DEPT_IDXINDEX RANGE SCAN ON CA T_IDX29.等式比较和范围比较当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.举例:DEPTNO上有一个非唯一性索引,EMP_CA T也有一个非唯一性索引.SELECT ENAMEFROM EMPWHERE DEPTNO > 20AND EMP_CA T = …A‟;这里只有EMP_CA T索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下:TABLE ACCESS BY ROWID ON EMPINDEX RANGE SCAN ON CA T_IDX30.不明确的索引等级当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的.举例:DEPTNO上有一个非唯一性索引,EMP_CA T也有一个非唯一性索引.SELECT ENAMEFROM EMPWHERE DEPTNO > 20AND EMP_CA T > …A‟;这里, ORACLE只用到了DEPT_NO索引. 执行路径如下:TABLE ACCESS BY ROWID ON EMPINDEX RANGE SCAN ON DEPT_IDX译者按:我们来试一下以下这种情况:SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP';INDEX_NAME UNIQUENES------------------------------ ---------EMPNO UNIQUEEMPTYPE NONUNIQUESQL> select * from emp where empno >= 2 and emp_type = 'A' ;no rows selectedExecution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 T ABLE ACCESS (BY INDEX ROWID) OF 'EMP'2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)虽然EMPNO是唯一性索引,但是由于它所做的是范围比较, 等级要比非唯一性索引的等式比较低!31.强制索引失效如果两个或以上索引具有相同的等级,你可以强制命令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‟;32.避免在索引列上使用计算.WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.举例:低效:SELECT …FROM DEPTWHERE SAL * 12 > 25000;高效:SELECT …FROM DEPTWHERE SAL > 25000/12;译者按:这是一个非常实用的规则,请务必牢记33.自动选择索引如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.举例:SELECT ENAMEFROM EMPWHERE EMPNO = 2326AND DEPTNO = 20 ;这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录.TABLE ACCESS BY ROWID ON EMPINDEX UNIQUE SCAN ON EMP_NO_IDX34.避免在索引列上使用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 >译者按:在这个例子中,作者犯了一些错误. 例子中的低效率SQL是不能被执行的.我做了一些测试:SQL> select * from emp where NOT empno > 1;no rows selectedExecution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 T ABLE ACCESS (BY INDEX ROWID) OF 'EMP'2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)SQL> select * from emp where empno <= 1;no rows selectedExecution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 T ABLE ACCESS (BY INDEX ROWID) OF 'EMP'2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)两者的效率完全一样,也许这符合作者关于” 在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点.35.用>=替代>如果DEPTNO上有一个索引,高效:SELECT *FROM EMPWHERE DEPTNO >=4低效:SELECT *FROM EMPWHERE DEPTNO >3两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.36.用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.在下面的例子中, LOC_ID 和REGION上都建有索引.高效:SELECT LOC_ID , LOC_DESC , REGIONFROM LOCA TIONWHERE LOC_ID = 10UNIONSELECT LOC_ID , LOC_DESC , REGIONFROM LOCA TIONWHERE REGION = “MELBOURNE”低效:SELECT LOC_ID , LOC_DESC , REGIONFROM LOCA TIONWHERE LOC_ID = 10 OR REGION = “MELBOURNE”注意:WHERE KEY1 = 10 (返回最少记录)OR KEY2 = 20 (返回最多记录)ORACLE 内部将以上转换为WHERE KEY1 = 10 AND((NOT KEY1 = 10) AND KEY2 = 20)译者按:下面的测试数据仅供参考: (a = 1003 返回一条记录, b = 1 返回1003条记录) SQL> select * from unionvsor /*1st test*/2 where a = 1003 or b = 1;1003 rows selected.Execution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 CONCATENATION2 1 T ABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'3 2 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)4 1 T ABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'5 4 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) Statistics----------------------------------------------------------0 recursive calls0 db block gets144 consistent gets0 redo size63749 bytes sent via SQL*Net to client7751 bytes received via SQL*Net from client68 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1003 rows processedSQL> select * from unionvsor /*2nd test*/2 where b = 1 or a = 1003 ;1003 rows selected.Execution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 CONCATENATION2 1 T ABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'3 2 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)4 1 T ABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'5 4 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) Statistics----------------------------------------------------------0 recursive calls0 db block gets143 consistent gets0 physical reads0 redo size63749 bytes sent via SQL*Net to client7751 bytes received via SQL*Net from client68 SQL*Net roundtrips to/from client0 sorts (memory)1003 rows processedSQL> select * from unionvsor /*3rd test*/2 where a = 10033 union4 select * from unionvsor5 where b = 1;1003 rows selected.Execution Plan----------------------------------------------------------0 SELECT ST ATEMENT Optimizer=CHOOSE1 0 SORT (UNIQUE)2 1 UNION-ALL3 2 T ABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'4 3 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)5 2 T ABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'6 5 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) Statistics----------------------------------------------------------0 recursive calls0 db block gets10 consistent gets0 physical reads0 redo size63735 bytes sent via SQL*Net to client7751 bytes received via SQL*Net from client68 SQL*Net roundtrips to/from client1 sorts (memory)0 sorts (disk)用UNION的效果可以从consistent gets和SQL*NET的数据交换量的减少看出37.用IN来替换OR下面的查询可以被更有效率的语句替换:低效:SELE CT….FROM LOCA TIONWHERE LOC_ID = 10OR LOC_ID = 20OR LOC_ID = 30高效SELECT…FROM LOCA TIONWHERE LOC_IN IN (10,20,30);译者按:这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的.38.避免在索引列上使用IS NULL和IS NOT NULL避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中.举例:。

Oracle的性能优化

Oracle的性能优化

千里之行,始于足下。

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

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

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

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

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

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

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

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

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

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

Oracle性能调整与优化71页PPT

Oracle性能调整与优化71页PPT
Oracle数据库性能 调整和优化
Oracle技术专题讲座
SUPPORT SERVICES
内容提要
1.oracle 性能调整概述 2.磁盘I/O的调整 3.oracle 内存分配与调整 4.SQL优化概述 5.Statspack概述
SUPPORT SERVICES
1.oracle 性能调整概述
SUPPORT SERVICES
2.5 管理回滚段
回滚段:用来保存数据变化前映像而提供一致读和保障 事务完整性的一段磁盘存储区域. 旧数据
回滚段
新数


UPDATE
SUPPORT SERVICES
2.5 管理回滚段
回滚段作用
回退事务
事务恢复
回滚段
读一致性
控制文件
数据文件
重做日志
SUPPORT SERVICES
SUPPORT SERVICES
2.4 使用本地管理表空间(LMT)自动段空间管理 (ASSM)
create tablespace demo datafile '/ora01/oem/demo01.dbf ' size 5m EXTENT MANAGEMENT LOCAL -- Turn on LMT SEGMENT SPACE MANAGEMENT AUTO -- Turn on ASSM;
OWNER ALEX
TABLE_NAME DEPT
PARTITION_COUNT 3
SUPPORT SERVICES
2.4 使用分区表避免磁盘争用
Select segment_name, partition_name, segment_type, tablespace_name

Oracle数据库性能优化指南说明书

Oracle数据库性能优化指南说明书

Real-World Performance Training Parallel ExecutionReal-World Performance TeamParallel ExecutionSerial and Parallel Execution•Serial Execution–SQL is executed by one process–The correct solution when:•the query references a small data set•high concurrency•efficiency is important•Parallel Execution–SQL is executed by many processes working together–The correct solution when:•the query references a large data set•low concurrency•elapsed time is important•Used to reduce the execution time of queries–Multiple processes work together to use more resources on the system, such as CPU and IOParallel ExecutionBasicsQuery Coordinator (QC)The “top level” process for the parallel queryParallel Execution Server (PX)An (OS) process that operates on part of a parallel query Parallel server group The group of parallel server processes that operate on arow sourceDegree of Parallelism (DoP)The number of parallel execution servers used in eachparallel server group during parallel executionParallel ExecutionWays to set the DoP•Table Setting–Can specify a value or set to parallel default•Hint–Useful for testing but usually not appropriate for production •Alter session–Useful for testing but usually not appropriate for production •Auto DoP–The optimizer determines the DoPParallel ExecutionConfiguration Parameters•parallel_min_servers–Specifies the minimum number of px processes started for the instance•parallel_max_servers–Specifies the maximum number of px processes started for the instance •parallel_threads_per_cpu–Specifies the number of px processes per CPU—OS threads are already accounted for in CPU_COUNT, so set to 1•Parallel_degree_policy–Determines how the DoP is calculatedParallel ExecutionPARALLEL_DEGREE_POLICY Parameter•The PARALLEL_DEGREE_POLICY parameter controls how the DoP is chosen –MANUAL•The default•Uses manual DoP rules–AUTO, which enables•Auto DoP•In Memory Parallel Execution•Parallel Statement Queuing–ADAPTIVE•The same as AUTO but also enables performance feedback to determine the DoP•New in 12c–LIMITED•Just enables Auto DoP–Only used when the table parallel decoration is set to DEFAULTParallel ExecutionManual DoP•The DoP is calculated based on table or system settings–Uses the parallel decoration on the table–If the table parallel decoration is set to “default” it uses the formulaCPU_COUNT * PARALLEL_THREADS_PER_CPU * # of instances •Manual DoP–Facilitates using a consistent DoP across users, schemas, queries and tables if tables have the same settings–Also allows for inconsistent DoPs if tables and/or instances have different settingsParallel ExecutionAuto DoP•First determines if the SQL statement will run serial or parallel–Uses the PARALLEL_MIN_TIME_THRESHOLD parameter–Defaults to 10 seconds–Defaults to 1 second for DBIM–Needed for DBIM on RAC•Automatically calculates the most “efficient” DoP for a SQL statement –Does not take system workload into account–The DoP calculation is based primarily on expected IO prior to 12c •Ignores the table parallel decorationResource Management with Parallel ExecutionParallel ExecutionWays to limit the DoP•Resource Manager–The Max DoP setting limits the DoP for a consumer group •PARALLEL_DEGREE_LIMIT–This parameter limits the DoP when using Auto DoPParallel ExecutionWays to control system resources with parallel execution•parallel_adaptive_multi_user–Reduces DoP based on system load–Usually reduces DoP too much—recommend setting to FALSE•Parallel statement queuing–Creates a FIFO queue for parallel statements–Make SQL statements wait for px resources to become available before execution starts instead of allowing SQL statements to run with insufficient px resources–When all of the parallel server processes in the pool are in use, statements queueParallel ExecutionThe Basics•Parallel execution is used to reduce the execution time of queries–Multiple processes work together to use more resources on the system, such as CPU and IO•A simple configuration should be used to determine the DoP–Coordinate parallel parameters–Avoid using hints and alter session•A resource management policy is needed when using parallel execution–To keep the system under control–To ensure SQL statements are able to execute in parallelPX Workload with No Resource Management•Available PX processes defined bythe following parameters which aredefined per instance–parallel_min_servers=32–parallel_max_servers=64•By default, PX servers will beallocated for parallel SQL and if allPX servers are busy subsequent SQLexecutions will be downgradedPX Workload with No Resource ManagementQuery Status RequestedDoPPXAllocatedExecutionDoPPX Workload with No Resource ManagementQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168PX Workload with No Resource ManagementQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412PX Workload with No Resource ManagementQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412C Running8168PX Workload with No Resource ManagementQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412C Running8168D Running1284PX Workload with No Resource ManagementQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412C Running8168D Running1284E Running3201PX Workload with Resource Management•parallel_min_servers andparallel_max_servers stilldefine the number of px serversavailable for execution•parallel_servers_targetdefines the pool of px serversavailable for SQL statements in thequeuePX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA8PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412C Running8168PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Running8168B Running122412C Running8168D Queued12PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Finished8168B Running122412C Running8168D Queued12PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Finished8168B Running122412C Running8168D Running122412PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Finished8168B Running122412C Running8168D Running122412E Queued32PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Finished8168B Finished122412C Finished8168D Finished122412E Queued32PX Workload with Parallel Statement QueuingQuery Status RequestedDoPPXAllocatedExecutionDoPA Finished8168B Finished122412C Finished8168D Finished122412E Running326432Parallel ExecutionParallel Statement Queuing•Parallel Statement Queuing–Can be enabled separately by setting _parallel_statement_queuing=true –Can be used with Resource Manager to create multiple queues for different consumer groups–Set PARALLEL_SERVERS_TARGET based on CPU resources on the systemParallel ExecutionRecommendations•Implement a simple setup to understand what is happening in the system •Base your plan/strategy on the amount of system resources you want to make available for parallel execution•Use resource manager to specify the max DoP for consumer groups •Set tables to the highest DoP that can be used in the resource manager plan。

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

例子3——优化前
select b.insuredname, b.insuredidno
from llclaimpedor a, lccont b where trim(a.contno) = trim(b.contno)
and a.caseno = '9055000006018488'
例子3——优化后
例子4——优化后
SELECT r.* FROM LOPRTManager r, LCCont t WHERE r.StateFlag in ('1') and (patchflag is null or patchflag <> '1') and r.Code <> '70' AND r.PrtType = '0' and t.ContNo = r.OtherNo and r.ManageCom like '86070101%' union all SELECT r.* FROM LOPRTManager r WHERE r.StateFlag in ('1') and (patchflag is null or patchflag <> '1') and r.ManageCom like '86070101%' AND r.PrtType = '0' and r.Code = '70' and r.PrtSeq = '1019010000132388' and r.PrtSeq = '1019010000132388'
索引创建原则
提高查询语句的效率,减慢了DML语句的速度 在全表扫描和索引之间权衡 在哪些列建立索引 Where字句中引用的列 Join中引用的列 在子表的FK上建立索引 • 防止对父表操作时锁住子表 在哪些列上不要建立索引 经常有DML操作 排它性小 Select count(1),count(distinct col_name ) from table_name
Result
Execution Plan
Row Source GeneratorBiblioteka execute执行计划
RBO和CBO
优化器决定SQL语句的执行路径,对性能至关重要。 基于规则的优化器 RBO (Rule Based Optimizer) • No change since oracle 7.3,desupported in oracle 10 • Stable, generate the execution plan according to fixed rules • Not necessary good • Do not support new oracle features(like IOT, partition, materialized view,…) 基于成本的优化器 CBO (Cost based optimizer) • Since oracle 7.3 • Support all oracle features • Better than RBO in most case, Can be bad in some case • Choose the best execution plan according to internal algorithm • Need to analyze schema to get the best execution plan
• 80/20原则
Enqueue activity for DB rollback segment stats for DB rollback segment storage for DB Undo Segment Stats for DB latch activity for DB dictionary Cache stats for DB SGA memory summary for DB init.ora parameters for DB
单独表空间(>90M) 设置参数timed_statistics=true • 在init<sid>.ora中设置该参数,并让其生效 • SQL>alter system set timed_statistics=true;
STATSPACK的安装
SQL> @?/rdbms/admin/spcreate.sql; 脚本将自动创建PERFSTAT用户,并提示保存 STATSPACK统计信息的表空间以及临时表空间
Oracle操作优先级
RBO Path 1: Single Row by Rowid(等级最高) RBO Path 2: Single Row by Cluster Join RBO Path 3: Single Row by Hash Cluster Key with Unique or Primary Key RBO Path 4: Single Row by Unique or Primary Key RBO Path 5: Clustered Join RBO Path 6: Hash Cluster Key RBO Path 7: Indexed Cluster Key RBO Path 8: Composite Index RBO Path 9: Single-Column Indexes RBO Path 10: Bounded Range Search on Indexed Columns RBO Path 11: Unbounded Range Search on Indexed Columns RBO Path 12: Sort Merge Join RBO Path 13: MAX or MIN of Indexed Column RBO Path 14: ORDER BY on Indexed Column RBO Path 15: Full Table Scan(等级最低) 14
STATSPACK报告
性能快照的采集
SQL>exec statspack.snap;
统计报告的生成
SQL> @?/rdbms/admin/spreport.sql;
性能快照的自动采集
SQL> @?/rdbms/admin/spauto.sql;
AWR报告
报告中关注哪些内容
Top 5 timed events
SQL书写原则
同样的SQL只写一次。 使用表的别名,降低解析时间。 SELECT子句中避免使用 ‘ * ‘ 减少访问数据库的次数 用Where子句替换HAVING子句 尽量多使用COMMIT 用>=替代> 用Union all代替union 尽量用EXISTS替代IN、用NOT EXISTS替代NOT IN 用EXISTS替换DISTINCT
系统设计人员 程序开发人员 数据库管理员 系统管理员
有哪些限制?
数据库优化总体原则
技术
逻辑 正确 实践 第一 把握 重点 让用 户参 与
沟通
简化 业务 逻辑 持续 改进
优化一般过程
定位问题
发现问题
提出优化 方案
跟踪实际 应用
验证优化 方案
STATSPACK报告
安装Statspack的准备
——数据库调优专题培训
2011年09月
培训目标
通过本次培训你将了解
• 数据库优化基本原则 • Oracle性能诊断工具的使用 • SQL优化主要手段及原则 • 数据库设计原则及其重要性
也很重要但本次不涉及
• 第三方优化工具的使用 • 数据库参数调优 • ……
2
数据库优化总体原则
为什么要优化? 优化的范围? 谁来优化?
Instance efficiency Top SQL
Cache size – Load profile – Instance efficiency Percentages • 数据库主要都在干什么– Top timed event Top SQL – Instance Activity statistic tablespace IO stats for – DB – • 内存命中率DB file IO stats for buffer pool statistics for – DB PGA Aggr Target Stats – for DB
SQL书写原则
少用in、Or关键词 避免在索引列上进行计算 在条件上多加引号,避免改变数据类型 避免在索引列上使用IS NULL和IS NOT NULL 使用复合索引的第一个列进行查询 在索引列上慎用LIKE字句 在存储过程中慎用打开超过一万行数据的游标 优先使用INT而不是Varchar2 优先使用Varchar2,而不是CHAR。 避免不必要的排序:distinct、order by
例子2——优化后
Select * from v_bc_lcinsured i, LLSubReport t, LLReportRela a where i.insuredno = t.customerno and t.SubRptNo = a.subrptno and a.rptno = '9050000000766388'
优化一般过程
定位问题
发现问题
提出优化 方案
跟踪实际 应用
验证优化 方案
Oracle 如何处理 SQL语句
User

SQL Stage 1: Create a Cursor Stage 2: Parse the Statement PARSER Stage 3: Bind Any Variables Dictionary Stage 4: Run the Statement RBO CBO Stage 5: Fetch Optimizer of a Query Cost-base Rows Rule-base Optimizer Optimizer Stage 6: Close the Cursor
相关文档
最新文档