ORACLE性能优化31条
oracle数据库性能调优
oracle数据库性能调优⼀:注意WHERE⼦句中的连接顺序:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾.尤其是“主键ID=?”这样的条件。
⼆: SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
简单地讲,语句执⾏的时间越短越好(尤其对于系统的终端⽤户来说)。
⽽对于查询语句,由于全表扫描读取的数据多,尤其是对于⼤型表不仅查询速度慢,⽽且对磁盘IO造成⼤的压⼒,通常都要避免,⽽避免的⽅式通常是使⽤索引Index。
三:使⽤索引的优势与代价。
优势:1)索引是表的⼀个概念部分,⽤来提⾼检索数据的效率,ORACLE使⽤了⼀个复杂的⾃平衡B-tree结构. 通常,通过索引查询数据⽐全表扫描要快. 当ORACLE找出执⾏查询和Update语句的最佳路径时, ORACLE优化器将使⽤索引. 同样在联结多个表时使⽤索引也可以提⾼效率. 2)另⼀个使⽤索引的好处是,它提供了主键(primary key)的唯⼀性验证.。
那些LONG或LONG RAW数据类型, 你可以索引⼏乎所有的列. 通常, 在⼤型表中使⽤索引特别有效. 当然,你也会发现, 在扫描⼩表时,使⽤索引同样能提⾼效率.代价:虽然使⽤索引能得到查询效率的提⾼,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本⾝也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反⽽会使查询反应时间变慢.。
⽽且表越⼤,影响越严重。
使⽤索引需要注意的地⽅:1、避免在索引列上使⽤NOT , 我们要避免在索引列上使⽤NOT, NOT会产⽣在和在索引列上使⽤函数相同的影响. 当ORACLE”遇到”NOT,他就会停⽌使⽤索引转⽽执⾏全表扫描.2、避免在索引列上使⽤计算.WHERE⼦句中,如果索引列是函数的⼀部分.优化器将不使⽤索引⽽使⽤全表扫描.举例:代码如下:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;⾼效:SELECT … FROM DEPT WHERE SAL > 25000/12;3、避免在索引列上使⽤IS NULL和IS NOT NULL避免在索引中使⽤任何可以为空的列,ORACLE性能上将⽆法使⽤该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果⾄少有⼀个列不为空,则记录存在于索引中.举例: 如果唯⼀性索引建⽴在表的A列和B列上, 并且表中存在⼀条记录的A,B值为(123,null) , ORACLE将不接受下⼀条具有相同A,B值(123,null)的记录(插⼊). 然⽽如果所有的索引列都为空,ORACLE将认为整个键值为空⽽空不等于空. 因此你可以插⼊1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE⼦句中对索引列进⾏空值⽐较将使ORACLE停⽤该索引.代码如下:低效:(索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;⾼效:(索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;4、注意通配符%的影响使⽤通配符的情况下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数据库的性能优化问题
马 红 云
( 中国民用航 空大连 空中交通管理站 辽宁大连 1 1 6 0 3 3 )
摘要 : Or a c l e 数 据库作 为 目前适 用性 最好 的关 系数据库 引擎之 一, 能够 支持 各种业 务形式 、 处理各 种复 杂事务 , 得 到极 为广泛 的应 用。
1对数据库服务器 内存分配的调整
由于对服务器 内存参数 的调整对o r a c l e 的性能影响显著 , 它成 为O r a c l e  ̄据库性能调 优的首选对象。 服务器 内存参数 的调整主要 是对数据库系统全局 区的调整 , 系统全局 区包括共享池、 数据缓冲 区、 日志缓冲区 。 其 中最主要的是对数据缓冲区和共享池 的参数调
3 . 2表 的分 区和 并行 技 术
如果必须要在数据库运行特别耗时的操作。 应尽量地把这样的 操作分解 , 严格 限制操作所涉及的记录数 , 并设法使操作并行 , 充分 地提高 执行效率 。 ( 1 ) 使用分区 分区技术有两个潜在的好处: 提高查询性能和提 高数据 库可用性 。 数据库查询 时, 优化器知道那些分区包含查询所 要的数据 。 而其它分 区数据将不会被读取 , 从而查询 任务将更快完 成。 许 多 管 理 工 作 可 在 只 一个 分 区上 进 行 , 而 不 影 响 其它 分 区 的数 据。 例 如 可 以选 择 只 删 除一 个 表 分 区 中 的数 据 。 可对 表 分 区进 行 再 分割 , 把一个表分区迁移到不同的表 空间上 。 可只对 一个表分 区进 行分析 统计 。 表分区的这 些特性 。 ( 2 ) 使用并行 。 Or a c l e 数据库 中几乎 所有的操作都 支持 并行 特 性, 包括查询、 插入 、 和数据加载。 并行选项可 以使多个处理器 同时 处理一条命令 , 在创建库数据库对象 时可以设定 并行参数 , 也可在 查询语句 中重新设 。
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建议。
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数据库性能优化与案例分析
性能优化探讨
• 原因:为什么? • 慢(响应时间) • 慢(吞吐量)
性能优化探讨
• 目的:为了什么? • 快(响应时间) • 快(吞吐量)
性能优化之案例分析
• 案例之方法论 • 案例之登录访问 • 案例之资源 • 案例之锁
性能优化方法论发展
• 登录输入指标测量 • 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优化的一些原则和方法。
一、优化原则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数据库的性能,。
第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数据库有很多参数可以配置,例如,缓存区大小、连接数、内存分配等。
通过针对不同的应用场景调整不同的参数配置,可以最大化地利用数据库的性能。
其次,针对SQL的性能问题,可以通过改进SQL语句来提高性能。
SQL优化是一项复杂的工作,但可以通过分析SQL执行计划来发现性能瓶颈,例如,缺乏索引、大表连接、高开销的子查询等。
并可以通过添加索引、优化查询语句等方式来提高数据库的性能。
除此之外,还可以通过加强硬件设备等方面来提升数据库性能。
例如,扩展数据库服务器的内存和硬盘容量,可以提高数据库的读写速度。
而使用高速网络设备如IB网络和10/100G以太网设备等,也可提高数据库的数据传输速度。
此外,Oracle数据库的性能优化也需要管理进程的支持与配合。
例如,数据库管理员需要监控数据库服务器硬件和软件性能,例如Oracle数据库的内部锁、等待事件、I/O活动等等。
在监控到性能问题后,需要在业务空档期进行优化,如调整SQL语句、更改数据库参数等。
总之,提高Oracle数据库的性能需要全面考虑软硬件配置、SQL语句等多个方面的因素。
通过合理的参数配置、SQL优化和硬件支持等方式,可以优化数据库的性能,提高应用的稳定性和响应速度。
Oracle的性能优化
千里之行,始于足下。
Oracle的性能优化
Oracle的性能优化是提高数据库系统性能和响应速度的关键步骤,可以通
过如下几个方面进行优化:
1. 数据库设计和规范化:合理的数据库设计和良好的规范化可以减少数据冗余,提高查询效率,避免数据冲突和不一致。
2. 索引优化:在频繁查询的字段上创建适当的索引,可以加快查询速度。
但是,索引不宜过多,因为它们会增加数据修改和插入的时间。
3. 查询优化:优化查询语句的执行计划,使用正确的连接方法(如内连接、外连接),避免全表扫描。
4. 硬件升级:增加内存、硬盘和处理器等硬件资源,可以显著提高
Oracle数据库的性能。
5. 优化配置参数:根据数据库的特点和应用的需求,调整数据库的配置参数,例如SGA大小、PGA大小、日志文件大小等,以提高性能。
6. 数据库优化:使用合适的数据库特性,如分区表、分区索引、物化视图等,优化数据库的存储和查询效率。
7. 监控和调优:持续监控数据库的性能指标,如CPU利用率、内存使用率、磁盘IO等,并及时进行适当的调优操作。
第1页/共2页
锲而不舍,金石可镂。
总体来说,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 学习笔记数据库命令 (2)Oracle的分区 (3)Oracle性能调优 (6)数据库命令查看用户表大小Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name查看表空间大小Select Tablespace_Name,Sum(bytes)/1024/1024 From Dba_Segments Group By Tablespace_Name创建表空间create tablespace tablespacename datafile ‘full path’ size numM online删除默认表空间USERS,由于USERS表空间在安装的时候默认为文件系统,有些时候处于数据库设备建立的需要,比如说建立成裸设备,我们需要将USERS表空间改成我们自己建立的裸设备,而USERS为数据库的默认表空间,直接删除是不可以的,那么就要使用命令将数据库默认表空间改成我们新建立的表空间,例如,新的表空间为USERS01,则使用alter database default tablespace USERS01然后drop tablespace USERS including contents查看表空间的物理路径以及大小select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_spacefrom dba_data_filesorder by tablespace_name查看表空间Select Tablespace_Name,Sum(bytes)/1024/1024From Dba_SegmentsGroup By Tablespace_Name关于WEB控制台创建一个EM资料库emca -repos create重建一个EM资料库emca -repos recreate删除一个EM资料库emca -repos drop配置数据库的 Database Controlemca -config dbcontrol db删除数据库的 Database Control配置emca -deconfig dbcontrol db重新配置db control的端口,默认端口在1158emca -reconfig portsemca -reconfig ports -dbcontrol_http_port 1160emca -reconfig ports -agent_port 3940先设置ORACLE_SID环境变量后,启动EM console服务emctl start dbconsole先设置ORACLE_SID环境变量后,停止EM console服务emctl stop dbconsole先设置ORACLE_SID环境变量后,查看EM console服务的状态emctl status dbconsole配置dbconsole的步骤emca -repos createemca -config dbcontrol dbemctl start dbconsole重新配置dbconsole的步骤emca -repos dropemca -repos createemca -config dbcontrol dbemctl start dbconsole查看目前数据库字符集select * from v$nls_parameters查看表大小select segment_name,(bytes/1024)/1024||'M',((BLOCKS*8196)/1024)/1024||'M'from USER_segments where segment_name='tablename'Oracle的分区全局索引适用于在全部记录中查询,比如要查询一个手机号之类的global index就是为整个分区表建立了一个大的索引。
Oracle数据库性能优化方法
[ 中图分类号]TP 1. 3 [ 3 I1 文献标识码]A [ 文章编 号]1 7 — 3 9 2 0 )3 0 3 —2 6 3 92 (0 7 0 —0 2 0
0 概 述
O al 数 据 库 是 一 个 高 性 能 的 大 型 数 据 库 , 内外 的 rc e 国 很 多 企 业 、 府 单 位 及 电 子 商 务 网 站 都 采 用 Orce 为 数 政 al 作 据库 服务 器 . al 分 考 虑 了 R B Orc e充 D MS的性 能 、 活 性 与 灵 稳定 性. 只要 数 据 库 设 计 合 理 , 确 配 置 实 例 , 供 规 模 足 正 提 够 的 服务 器 和 性 能 优 异 的硬 件 , 并正 确调 整操 作 系 统 , 可 就 以得 到很 好 的 性 能 . Orce 据 库 的优 化 没 有 绝 对 的 指 标 , 常 用 优 化 前 al 数 通 后 数 据 库 的各 种性 能 指 标 作 为 评 价 依 据 , 比如 S QL语 句 的 执 行 速 度 , 据 库 的命 中 率 , 源 占 用 情 况 等 等. 化 工 作 数 资 优 通 常 是 由 一 系 列 的 “ 衷 ” 组 成 . 旦 用 户 识 别 出 瓶 颈 问 折 所 一 题 所 在 , 可 能 需 要 牺 牲 其 他 系 统 资 源来 获 得 预 期 的效 果 . 就 1 O al 数 据 库 的优 化方 法 rc e
许 华 容
( 州 大学 计 算 机 科 学 与技 术 学 ,贵 阳 5 0 2 ) 贵 5 0 5
[ 摘
要 ]Orce 据 库 是 现 在 使 用 最广 泛 的大 型 数 据 库 之 一 , 性 能 的优 化 为 大 量 用 户 所 关 注 的 焦 点 . 文 从 Or al 数 其 本 a
53个ORAQCLE 语句优化规则
53个Oracle语句优化规则详解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数据库的性能优化
T B级 ,磁 盘 的 输 入 / 出数 据 量 很 高 ,但 输
对 响应 时 间 要求 不 高 。
( 2)销 账 系 统 。 主 要 负 责 缴 费 销 账 , 面 对 的 是 前 台 营 业 员 以 及 电 信 客 户 , 用
户 数 多 , 数 据 库 连 接 数 可 以 达 到 300 以 上 , 数 据 量 一 般 在 3 0 GB 左 右 , 磁 盘 的 0
维普资讯
电信投 求
。
袁 胜 中
数 据 库 的
性能优 化
武 汉 电信分公 司 武汉 40 3 07 1
Or c e数 据 库 在 运 行 过 程 中 会 产 生 大 al
不 影 响 外 界 对 数 据 库 的 访 问 , 这 样 可 以 实 现 故 障 的 无 缝 切 换 ) 从 电信 计 费 系统 。
统 ,主 要 负 责 采 集 用 户 的 原 始 话 单 ,并 根 据 计 费 策 略 和 规 则 进 行 账 务 结 算 , 最 后 形 成 用 户 的 缴 费 信 息 。 计 费 系 统 的 主 要 使 用 对 象 是 计 费 人 员 ,用 户 数 少 ,数 据 库
连接 数一 般在 4 0~ 5 0个 , 数 据 量 一 般 在
单 点故 障 时能 够保 证 对 外服 务不 问断 。 电信 计 费 系统 从 功能 和 运 行 特 点上 可 以划 分 为 如下 两个 部 分 。 (1 ) 计 费 系 统 。 它 是 一 个 批 处 理 系
据 , 同时 使 统 计 人 员 取 得 所 需 的 计 费 数 据
为 经营 分 析提 供决 策 依 据等 。
该 区 域 的 调 整 主 要 是 根 据 应 用 环 境 调 整 k e 池 、循 环 池 和 默 认 池 eP
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。
ORACLE数据库变得非常慢解决方案一例
ORACLE数据库变得非常慢解决方案一例最近在为一个项目做数据库优化,发现ORACLE数据库运行得特别慢,简直让人头大。
今天就来给大家分享一下我是如何一步步解决这个问题的,希望对你们有所帮助。
事情是这样的,那天老板突然过来,一脸焦虑地说:“小王,你看看这个数据库,查询速度怎么这么慢?客户都投诉了!”我二话不说,立刻开始分析原因。
我打开了数据库的监控工具,发现CPU和内存的使用率都很高,看来是数据库的压力确实很大。
然后,我开始查看慢查询日志,发现了很多执行时间很长的SQL语句。
这时,我意识到,问题的根源可能就在这些SQL语句上。
一、分析SQL语句1.对执行时间长的SQL语句进行优化。
我检查了这些SQL语句的写法,发现很多地方可以优化。
比如,有些地方使用了子查询,我尝试将其改为连接查询,以提高查询效率。
2.检查索引。
我发现有些表上没有合适的索引,导致查询速度变慢。
于是,我添加了合适的索引,以提高查询速度。
3.调整SQL语句的顺序。
有些SQL语句的执行顺序不当,导致查询速度变慢。
我调整了这些语句的顺序,使其更加合理。
二、调整数据库参数1.增加缓存。
我发现数据库的缓存设置比较低,导致查询时需要频繁读取磁盘。
我适当增加了缓存大小,以提高查询速度。
2.调整线程数。
我发现数据库的线程数设置较低,无法充分利用CPU资源。
我将线程数调整为合适的值,以提高数据库的处理能力。
3.优化数据库配置。
我对数据库的配置文件进行了调整,比如调整了日志文件的存储路径和大小,以及调整了数据库的备份策略等。
三、检查硬件资源1.检查CPU。
我查看了CPU的使用情况,发现CPU负载较高。
我建议公司采购更强大的CPU,以提高数据库的处理能力。
2.检查内存。
我发现内存的使用率也很高,于是建议公司增加内存容量。
3.检查磁盘。
我检查了磁盘的读写速度,发现磁盘的I/O性能较低。
我建议公司更换更快的磁盘,以提高数据库的读写速度。
四、定期维护1.定期清理数据库。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)中的内存可以被所有的数据库用户共享。
因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径。
ORACLE的这个功能大大地提高了SQL 的执行性能并节省了内存的使用。
可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。
数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。
当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。
这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。
数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。
共享的语句必须满足三个条件:A、字符级的比较:当前被执行的语句和共享池中的语句必须完全相同。
B、两个语句所指的对象必须完全相同:C、两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。
4.选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理。
在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
当ORACLE处理多个表时,会运用排序及合并的方式连接它们。
首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。
5.WHERE子句中的连接顺序ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE 条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
6.SELECT子句中避免使用' * '当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*' 是一个方便的方法。
不幸的是,这是一个非常低效的方法。
实际上,ORACLE在解析的过程中,会将'*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。
7.减少访问数据库的次数当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。
由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。
8.使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
9.整合简单,无关联的数据库访问如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)10.删除重复记录11.用TRUNCATE替代DELETE当删除表中的记录时,在通常情况下,回滚段(rollback segments ) 用来存放可以被恢复的信息。
如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)。
而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息。
当命令运行后,数据不能被恢复。
因此很少的资源被调用,执行时间也会很短。
12.尽量多使用COMMIT只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少COMMIT所释放的资源:A、回滚段上用于恢复数据的信息。
B、被程序语句获得的锁。
C、redo log buffer 中的空间。
D、ORACLE为管理上述3种资源中的内部花费。
13.计算记录条数和一般的观点相反,count(*) 比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的。
例如COUNT(EMPNO)14.用Where子句替换HAVING子句避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。
这个处理需要排序,总计等操作。
如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
15.减少对表的查询在含有子查询的SQL语句中,要特别注意减少对表的查询。
16.通过内部函数提高SQL效率17.使用表的别名(Alias)当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。
这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
18.用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。
在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率。
19.用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并。
无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历)。
为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
20.用表连接替换EXISTS通常来说,采用表连接的方式比EXISTS更有效率21.用EXISTS替换DISTINCT当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。
一般可以考虑用EXIST替换22.用索引提高效率:索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。
那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。
定期的重构索引是有必要的.:ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>23.sql语句用大写的因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行24.在java代码中尽量少用连接符“+”连接字符串!25.用>=替代>高效: SELECT * FROM EMP WHERE DEPTNO >=4低效: SELECT * FROM EMP WHERE DEPTNO >3两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.26.用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.27.避免在索引列上使用IS NULL和IS NOT NULL避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.低效: (索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 高效: (索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;28.用UNION-ALL 替换UNION ( 如果有可能的话):当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量29.需要当心的WHERE子句:某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. 在下面的例子里, (1)…!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) …||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) …+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.30.带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强31.优化GROUP BY:提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多。