oracle的优化30个规则

合集下载

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性能优化31条

ORACLE性能优化31条

1.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)中的内存可以被所有的数据库用户共享。

oracle优化方案

oracle优化方案

千里之行,始于足下。

oracle优化方案Oracle优化方案Oracle数据库是当今企业界最受欢迎的关系型数据库管理系统之一。

但是,随着数据量的不断增加和业务需求的不断增长,数据库的性能问题也会渐渐变得突出。

因此,对Oracle数据库进行优化是提高系统性能和运行效率的关键。

本文将介绍几个常见的Oracle数据库优化方案,挂念您更好地管理和优化您的数据库环境。

1. 索引优化索引是提高查询性能的关键。

可以通过以下几个方面对索引进行优化:(1)合理选择索引类型:依据查询的特点和数据分布选择合适的索引类型,如B-tree索引、位图索引等。

(2)避开过多的索引:过多的索引会增加数据插入、更新和删除的成本,并降低查询性能。

只保留必要的索引,可以有效提高性能。

(3)定期重建和重新组织索引:定期重建和重新组织索引可以提高索引的查询效率,削减碎片和冗余。

2. SQL优化SQL语句是Oracle数据库的核心,对SQL进行优化可以显著提高数据库的性能。

以下是一些SQL优化的建议:第1页/共3页锲而不舍,金石可镂。

(1)优化查询语句:避开使用不必要的子查询,尽量使用连接查询代替子查询,削减查询次数。

同时,避开使用全表扫描,可以通过创建合适的索引来提高查询效率。

(2)避开使用不必要的OR运算符:OR运算符的查询效率较低,应尽量避开使用。

可以通过使用UNION或UNION ALL运算符代替OR运算符来提高性能。

(3)避开使用ORDER BY和GROUP BY子句:ORDER BY和GROUP BY子句会造成排序和分组操作,对于大数据集来说是格外耗时的。

假如可能,可以考虑使用其他方式来实现相同的功能。

3. 系统资源优化合理配置和管理系统资源是确保数据库运行稳定和高效的重要因素。

以下是一些建议:(1)合理安排内存:依据系统和数据库的实际需求,合理安排内存资源。

调整SGA(System Global Area)区域的大小,确保适当的内存安排给缓冲池和共享池。

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 Sql语句优化原则

oracle Sql语句优化原则

S ql语句优化原则一、优化原则1、避免使用硬编码,改用绑定变量实现。

举例:String str =’ select * from t_zx_ryjbxxb where xm=’+params;上面这条语句使用了硬编码,使用这种方式存在两方面问题:每次执行sql语句时都需要重新解析sql语句;可能会遭遇sql注入攻击。

如在上面的语句中输入张三' or 1='1,则会把所有的记录都显示出来。

解决的方法就是使用占位符代替硬编码。

如下:String str =’select * from t_zx_ryjbxxb where xm=?’;2、当插入的数据为数据表中的记录数量的10%以上,首先需要删除该表的索引来提高数据的插入效率,当数据插入后,再建立索引。

3、避免在索引列上使用函数或计算,在where子句中,如果索引是函数的一部分,优化器将不再使用索引而使用全表扫描。

举例:低效:select * from dept where sal*12 >2500;高效:select * from dept where sal>2500/12;4、避免在索引列上使用not和“!=”,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到not 和“!=”时,就会停止使用索引而去执行全表扫描。

5、使用关联查询替代in ,可以提高查询的效率。

6、使用not exists子查询替代not in。

在子查询中,NOT IN子句将执行一个内部的排序和合并。

无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历)。

为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.举例:select * from t_zx_ryjbxxb where rybh not in(select rybh from t_zx_cqrb) and jwh=''select * from t_zx_ryjbxxb a where not exists(select1from t_zx_cqrb b where a.rybh =b.rybh)使用union-all 替代union:当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。

oracle索引优化原则

oracle索引优化原则

oracle索引优化原则Oracle索引是数据库优化中非常重要的一部分,它们能够在查询数据时提高查询效率和性能。

然而,在使用Oracle索引时,需要遵守一些原则,以便最大程度地提高查询效率和性能。

以下是一些Oracle索引优化的原则。

1.只在需要时使用索引Oracle索引能够帮助我们提高查询效率和性能,但它们也会降低更新和插入数据的速度。

因此,我们应当仅在需要时使用索引。

如果使用过多的索引,会导致查询语句变得复杂并且更新和插入速度变慢,从而影响整个数据库系统的性能。

2.使用唯一性索引唯一性索引可以帮助我们避免重复数据的插入和更新。

当数据库表中的某个列需要具有唯一性时,我们可以使用唯一性索引来实现。

这将确保同一列中的值不重复,从而提高整个数据库系统的性能。

3.使用复合索引如果查询语句需要同时查询多个列,我们可以使用复合索引来提高查询效率和性能。

使用复合索引时,需要注意索引的顺序,应该从前往后按照查询条件的顺序构建索引。

这样可以避免Oracle优化器无法使用索引而导致的全表扫描。

4.选择正确的索引类型Oracle提供不同的索引类型,包括B树索引、位图索引、函数索引等。

在选择索引类型时,我们应当根据查询语句的类型和数据的特点来选择最适合的索引类型。

例如,如果查询语句需要对大量的布尔类型或枚举类型数据进行查询,那么位图索引可能比B树索引更适合。

5.避免过度索引化过多的索引将会降低数据库系统的性能,每个索引都需要消耗一定的内存和磁盘空间,使得查询和更新操作变得更慢。

因此,我们应避免对相同的列建立多个重复的索引,并仅为确实需要的列创建合适的索引。

6.定期维护索引当数据表中的数据发生变化时,索引也需要随之更新。

因此,我们需要定期进行索引维护和优化,以确保索引数据与实际数据的一致性。

这样可以避免索引中出现“死数据”,也可以提高查询效率和性能。

在某些情况下,Oracle优化器会选择错误的索引,从而影响查询效率和性能。

oracle语句优化30个规则详解

oracle语句优化30个规则详解

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)中的内存可以被所有的数据库用户共享。

oracle 的 SQL语句优化基本原则

oracle 的 SQL语句优化基本原则

一、操作符优化1、IN 操作符ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。

由此可见用IN的SQL至少多了一个转换的过程。

推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。

2、NOT IN操作符此操作是强列不推荐使用的,因为它不能应用表的索引。

推荐方案:用NOT EXISTS 方案代替3、IS NULL 或IS NOT NULL操作(判断字段是否为空)判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。

推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为a>0 或a>”’’等。

4、> 及< 操作符(大于或小于操作符)大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。

那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE 会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

5、LIKE操作符LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。

一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号YY_BH LIKE‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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优化器Oracle的优化器共有3种:a.RULE(基于规则)b.COST(基于成本)c.CHOOSE(选择性)设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。

你当然也在S QL句级或是会话(session)级对其进行覆盖。

为了使用基于成本的优化器(CBO,Cost-Based Optimizer),你必须经常运行anal yze命令,以增加数据库中的对象统计信息(object statistics)的准确性。

如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。

如果table已经被analyze过,优化器模式将自动成为CBO,反之,数据库将采用RULE形式的优化器。

在缺省情况下,Oracle采用CHOOSE优化器,为了避免那些不必要的全表扫描(fu ll table scan),你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

2.访问Table的方式Oracle采用两种访问表中记录的方式:a.全表扫描全表扫描就是顺序地访问表中每条记录。

Oracle采用一次读入多个数据块(databas e block)的方式优化全表扫描。

b. 通过ROWID访问表你可以采用基于ROWID的访问方式情况,提高访问表的效率,ROWID包含了表中记录的物理位置信息……Oracle采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。

通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。

3.共享SQL语句为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。

这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。

oracle优化原则和方法

oracle优化原则和方法

千里之行,始于足下。

oracle优化原则和方法以下是 Oracle 数据库优化的一些常用原则和方法:1. 设计良好的数据模型:良好的数据模型可以提高查询效率和数据存储的优化。

正确地选择适当的数据类型和大小,避免数据冗余和重复,尽量避免使用过多的空值和复杂的关联查询。

2. 优化 SQL 查询语句:编写高效的 SQL 查询语句可以提高数据库的性能。

使用合适的索引,避免全表扫描和排序操作,减少连接和子查询的使用。

3. 使用合适的索引:索引是提高查询效率的重要手段。

根据查询频率和查询条件,选择合适的列作为索引,并进行适当的索引优化,例如使用覆盖索引,避免过多的索引维护等。

4. 适当分区和分表:对于大型数据库,可以考虑使用分区表或分表来提高查询和维护的效率。

根据查询频率和数据访问模式,合理划分分区和分表的范围,并使用合适的分区键或分表方式。

5. 避免过度归档:归档是 Oracle 数据库的重要特性,但过度归档会增加数据库的存储需求和维护成本。

根据实际需求和存储能力,合理设置归档策略,避免无谓的归档操作。

6. 配置适当的内存和磁盘资源:合理配置数据库的内存和磁盘资源对于提高性能非常重要。

增加 SGA(System Global Area)和 PGA(Program Global Area)的大小,以减少物理 IO 的次数;使用高速磁盘和 RAID 阵列来提高数据的存取速度。

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

7. 使用合适的数据库连接方式:合理选择数据库连接方式可以提高数据库的并发性和可用性。

使用连接池和并发控制手段,避免过多的连接和死锁等问题。

8. 定期维护和监控数据库:定期进行数据库的维护和监控非常重要,包括执行备份和恢复、清理过期数据、数据库优化等操作。

监控数据库的性能和健康状况,及时发现和解决问题,保证数据库的稳定和可靠运行。

9. 使用适当的数据库调优工具:Oracle 提供了一系列的数据库调优工具和性能监控工具,可以辅助进行数据库的优化工作。

oracle语句优化方法大全

oracle语句优化方法大全
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
select * from record where amount/30< 1000(11秒)
select * from record where to_char(ActionTime,’yyyymmdd’)=’19991201′(10秒)
由于where子句中对列的任何操作结果都是在SQL运行时逐行计算得到的,因此它不得不进行表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表扫描,因此将SQL重写如下:
不过下面还是总结了一下降龙十八掌内功的入门基础,建立索引常用的规则如下:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上(选择性高,返回的数据就会少一点);
取值范围 1~5 6 7
占总数据量的百分比 1% 98% 1%
而且,常用的查询中,查询 DisposalCourseFlag<6 的情况既多又频繁,毫无疑问,如果能够建立索引,并且被应用,那么将大大提高这种情况的查询效率。因此,我们需要在该字段上建立索引。

优化sql语句提高oracle执行效率

优化sql语句提高oracle执行效率

优化sql语句提高oracle执行效率
1.尽可能高效:采用最有效的查询方式、避免使用不必要的查询语句、提高检索速度而非数据量。

2.避免使用子查询:尽量不使用子查询,把子查询换成联合查询或者
通过多表连接更新数据。

3.避免重复读取:尽量从数据库中读取一次数据,不要读取多次相同
的数据,避免多次查询,提高数据库的查询效率。

4.避免使用NOTIN和NOTEXISTS:尽量不用NOTIN和NOTEXISTS查询
语句,因为这种查询方式比较耗时,可以把NOTIN换成LEFTJOIN不为空
即可。

5.避免使用OR:尽量不用OR,用AND替代OR,AND通常比OR更有效。

6.避免使用模糊查询:尽量不用模糊查询,模糊查询效率较低,可以
用相似查询替代模糊查询。

7.合并多个表:如果有多个表,尽量合并这些表,以便减少查询次数。

8. 使用索引: 设置索引来提高查询速度,尽可能在 Where、Group by、Having、Order by等关键字中使用索引。

9. 优化sql语句顺序: 尽可能把WHERE条件的语句写在前面,以便
优先查询出少量的数据来,提高查询效率;把ORDER BY语句写在最后,
以便能有效地利用索引。

10.选择可用的查询方法:使用最适合的查询方法,选择适当的SELECT语句、JOIN语句和UNION语句,以使SQL语句更快地返回结果。

11. 避免使用Distinct: Distinct能会导致查询效率降低,尽量避免使用Distinct。

Oracle系统参数调整和优化原则(精)

Oracle系统参数调整和优化原则(精)

Oracle 系统参数调整和优化原则(来自时代朝阳数据库技术中心)粗略来讲,系统调整一般反映在下列方面:∙Shared Pool and Library Cache Performance Tuning(共享池和Library Cache):Oracle将SQL语句、存储包、对象信息和很多其他的项目保存在SGA中一个叫共享池(shared pool)的地方。

这个可共享的区域由一个成熟的高速缓存和堆管理器管理。

它有3个基本的问题要克服:o内存分配的单元不是个常量。

从池中分配的内存单元可能是从几个字节到几千个字节。

o在用户完成工作时,不是所有的内存都能够释放出来,因为共享池的目标是使信息最大程度的共享。

o没有一个象其他常规的高速缓存的文件做后备的存储那样磁盘空间供整页的导出。

只有可重新创建的信息可以从Cache中丢弃,在他被再次需要的时候再重新创建。

共享池调整的技巧有:o刷(Flush)共享池可以使小块的内存合并为大块的内存。

当共享池的碎片过多时,这能够暂时恢复性能。

刷共享池可以使用语句:alter system flush shared_pool;o注意执行这个语句将会造成性能的暂时尖峰,因为对象都要重新加载。

所以应当在数据库的负载不是很大的情况下进行。

o确保联机事务处理(OLTP)应用使用绑定变量(bind variables). 这一点对于决策支持系统(DSS)并不重要。

o确保library cache 的命中率> 95%o增大共享池并不总能解决命中率过多的问题。

∙Buffer Cache Performance Tuning(数据库缓存调整):数据库缓存保持了从磁盘上读去的数据块的备份。

因为缓存通常受到内存约束的限制,不是磁盘上所有的数据都可以放到缓存里。

当缓存满了的时候,后来的缓存不中使得Oracle 将已经在缓存中的数据写到磁盘上。

后续的对写到磁盘上的数据的访问还会造成缓存不中。

从缓存调整的角度看,应力求避免以下的问题:o'缓存的最近最少使用(LRN)链'('cache buffers LRU chain' )的加锁竞争o'平均写队列'("Average Write Queue" )长度过大o过多时间花在等待‘写完毕等待上’("write complete waits" )o过多时间花在等待‘缓冲释放等待’上("free buffer waits" )∙Latch Contention加锁(插销)竞争:插销加锁是SGA中保护共享数据结构的低层的串行化机制。

oracle优化方法总结

oracle优化方法总结

千里之行,始于足下。

oracle优化方法总结1. 使用合适的索引:索引是提高查询效率的重要方式,应根据查询的频率和字段的选择性进行索引的创建和优化。

同时,也要注意避免过多索引的创建,以提高插入和更新操作的效率。

2. 优化SQL语句:合理地编写SQL语句可以提高查询的效率。

例如,使用JOIN代替子查询、避免使用不必要的DISTINCT、避免不必要的OR条件等等。

3. 使用合适的存储结构:Oracle提供了多种存储结构,如表空间、分区表等。

根据具体的应用场景选择合适的存储结构,可以提高数据的存取效率。

4. 合理地设置参数:Oracle提供了多个参数可以配置数据库的行为,如缓冲区大小、并行度等。

根据具体的应用需求和硬件配置,合理地设置这些参数可以提高数据库的性能。

5. 监控和调优:通过监控数据库的性能指标,如查询响应时间、硬盘利用率等,可以及时发现性能瓶颈并进行优化。

使用Oracle提供的工具,如AWR、ASH等,可以帮助识别和解决性能问题。

6. 分析和优化查询计划:Oracle使用查询计划来执行查询,通过分析和优化查询计划,可以提高查询的效率。

可通过使用explain plan命令、SQL Tuning Advisor等工具来分析查询计划,并根据情况进行优化。

7. 数据库的归档和归档恢复:对于重要的数据,进行定期的归档和归档恢复可以提高数据库的稳定性和可靠性。

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

8. 控制并发操作:并发操作可能导致数据库出现锁等性能问题。

通过使用事务、锁机制、并发控制等方法,可以有效地控制并发操作,提高数据库的性能。

9. 合理地划分表空间和分区:根据应用的数据特点和访问模式,合理地划分表空间和分区,可以提高数据的存取效率。

10. 定期维护数据库:定期进行数据库的维护工作,如数据清理、索引重建、统计信息收集等,可以保持数据库的性能和稳定性。

oracle优化方案

oracle优化方案

千里之行,始于足下。

oracle优化方案有很多方法可以优化Oracle数据库性能,以下是一些常用的优化方案:1. 确保适当的数据库设计:良好的数据库设计是优化性能的基础。

这包括正确的表结构设计、索引的创建和维护以及适当的数据类型选择等。

2. 优化SQL查询语句:优化SQL查询是提高数据库性能的关键。

可以通过分析查询计划、重写复杂查询、减少不必要的连接和子查询等方式来优化查询语句。

3. 创建适当的索引:索引是加速查询的关键。

确保创建适当的索引,可以大大提高查询性能。

可以根据查询频率和字段选择性等因素来选择创建索引的字段。

4. 定期收集统计信息:Oracle提供了收集统计信息的工具,用于优化查询计划的生成。

定期收集统计信息可以帮助Oracle优化器生成更优的查询计划。

5. 合理配置Oracle参数:Oracle的许多参数可以配置,以提高性能。

例如,可以调整内存参数和并发连接参数来提高性能。

6. 使用合适的存储布局:合适的存储布局可以最大限度地减少磁盘I/O操作,提高性能。

使用适当大小的数据块、合理的表空间和分区等可以优化数据库的存储布局。

7. 定期优化数据库物理结构:随着数据库使用的增加,物理结构可能会出现碎片化。

通过定期的重建和重组可以消除碎片,恢复数据库性能。

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

8. 使用合理的并发控制:并发控制是数据库系统中重要的一部分。

使用适当的并发控制策略可以避免数据冲突和死锁,提高性能。

9. 使用缓存和缓存技术:Oracle提供了缓存和缓存技术来提高性能。

可以使用数据库缓存和应用程序级缓存等来减少磁盘I/O操作和网络开销。

10. 使用分布式数据库:如果数据库负载过重,可以考虑使用分布式数据库来分摊负载,提高性能。

以上是一些常用的Oracle优化方案,具体的优化方案需要根据实际情况进行选择和调整。

oracle代码优化规范

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参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 (6)使用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优化器,在这里拿出来和大家分享一下,希望对大家有用。

影响系统性能类可变参数(1)CHECKPOINT_PROCESS该参数根据是否要求检查点而设置成TRUE或者FALSE。

当所有缓冲区的信息写到磁盘时,检查点进程(CHPT)建立一个静态的点。

在归档日志文件中做一个记号表示有一个检查点发生。

检查点发生在归档日志转换的时候或当达到log_checkpoint_interval定义的块数的时候。

当设置此参数为TRUE时,后台进程CHPT便可工作。

在检查点期间内,若日志写进程(LGWR)的性能减低,则可用CHPT进程加以改善。

(2)DB_BLOCK_CHECKPOINT_BATCH该参数的值设置得较大时,可加速检查点的完成。

当指定的值比参数DB_BLOCK_CHECKPOINT_BATCH大时,其效果和指定最大值相同。

(3)DB_BLOCK_BUFFERS该参数是在SGA中可作缓冲用的数据库块数。

该参数决定SGA的大小,对数据库性能具有决定性因素。

若取较大的值,则可减少I/O次数,但要求内存空间较大。

每个缓冲区的大小由参数DB_BLOCK_SIZE决定。

(4)DB_BLOCK_SIZE该参数表示Oracle数据库块的大小,以字节为单位,典型值为2048或4096。

该值一旦设定则不能改变。

它影响表及索引的FREELISTS参数的最大值。

(5)DB_FILES该参数为数据库运行时可打开的数据文件最大数目。

(6)DB_FILE_MULTIBLOCK_READ_COUNT该参数表示在顺序扫描时一次I/O操作可读的最大块数,该最大块数取决于操作系统,其值在4至16或者32是比较好。

(7)D1SCRETE_TRANSACTION_ENABLED该参数实现一个更简单、更快的回滚机制,以改进某些事务类型的性能。

当设置为TRUE时,可改善某些类型的事务性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle语句优化30个规则详解
上一篇 / 下一篇 2008-11-30 17:57:21 / 个人分类:oracle实践开发
查看( 283 ) / 评论( 0 ) / 评分( 0 / 0 )
1. 选用适合的Oracle优化器
Oracle的优化器共有3种:
a. RULE (基于规则)
方法2 (次低效)
DECLARE
CURSOR C1 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO …,..,.. ;
6. SELECT子句中避免使用 ‘ * ’
当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中, 会将‘*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
例如: EMP表描述了LOCATION表和CATEGORY表的交集。
SELECT *
FROM LOCATION L ,
CATEGORY C,
Work_city public synonym
Plant_detail public synym
Work_city public synonym
Plant_detail table owner
考虑一下下列SQL语句能否在这两个用户之间共享。
全表扫描就是顺序地访问表中每条记录。 ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。
b. 通过ROWID访问表
你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息……ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。
SELECT COUNT(*),SUM(SAL)
FROM EMP
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;
3. 共享SQL语句
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。 ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。
OPEN C1(291);
FETCH C1 INTO …,..,.. ;
CLOSE C1; END;
方法3 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
和下列每一个都不同
SELECT * from EMP;
Select * From Emp;
SELECT * FROM EMP;
B. 两个语句所指的对象必须完全相同:
例如:
用户 对象名 如何访问
Jack sal_limit private synonym
例如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。
数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。
当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。
[NextPage]
8. 使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
例如:
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE ‘SMITH%’;
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
2. 访问Table的方式Oracle采用两种访问表中记录的方式:
a. 全表扫描
select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id 不能 用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.
[NextPage]
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_city
C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)
例如:第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)
a.
select pin , name from people where pin = :blk1.pin;
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
将比下列SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。
如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。
b. COST (基于成本)
c. CHOOSE (选择性)
设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖。
7. 减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等。 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量。
相关文档
最新文档