oracle 优化
来源:互联网 发布:Java视频 编辑:程序博客网 时间:2024/05/15 12:37
1. PLSQL程序优化原则
1.1 导致性能问题的内在原因 ,从系统底层分析也就是如下几个原因:
l CPU占用率过高,资源争用导致等待
l 内存使用率过高,内存不足需要磁盘虚拟内存
l IO占用率过高,磁盘访问需要等待
1.2 PLSQL优化实际上就是避免出现“导致性能问题的内在原因”,实际上编写程序,以及性能问题跟踪应该本着这个核心思想去考虑和解决问题。
l PLSQL程序占用CPU的情况
n 系统解析SQL语句执行,会消耗CPU的使用
n 运算(计算)会消耗CPU的使用
l PLSQL程序占用内存的情况
n 读写数据都需要访问内存
n 内存不足时,也会使用磁盘
l PLSQL程序增大IO的情况
n 读写数据都需要访问磁盘IO
n 读取的数据越多,IO就越大
大家都知道CPU现在都很高,计算速度非常快;访问内存的速度也很快;但磁盘的访问相对前两个相比速度就差的非常大了,因此PLSQL性能优化的重点也就是减少IO的瓶颈,换句话说就是尽量减少IO的访问。
性能的优先级CPU->内存->IO,影响性能的因素依次递增。
根据上面的分析,PLSQL优化的核心思想为:
1. 避免过多复杂的SQL脚本,减少系统的解析过程
2. 避免过多的无用的计算,例如:死循环
3. 避免浪费内存空间没有必要的SQL脚本,导致内存不足
4. 内存中计算和访问速度很快
5. 尽可能的减少磁盘的访问的数据量,该原则是PLSQL优化中重要思想。
6. 尽可能的减少磁盘的访问的次数,该原则是PLSQL优化中重要思想。
Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO),在Oracle8及以后的版本,Oracle强列推荐用CBO的方式.
RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
CBO方式:它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。 这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。
优化模式包括Rule、Choose、First rows、All rows四种方式: 自从Oracle8.1.5引入dbms_stats包,Oracle及专家们就推荐使用dbms_stats取代analyze。
理由如下:
1. dbms_stats可以并行分析
2. dbms_stats有自动分析的功能(alter table monitor )
3. analyze分析统计信息的有些时候不准确
表分析 索引分析
exec dbms_stats.gather_table_stats(ownname => 'cy_test',tabname => 'COM_T_PARAM',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt=> 'for all indexed columns') ;
exec dbms_stats.gather_index_stats(ownname => 'cy_test',indname => 'PK_COM_T_PARAM',estimate_percent => '10',degree => '4') ;
ANALYZE TABLE tablename COMPUTE|ESTIMATE|DELETE STATISTICS;
analyze index indexname COMPUTE|ESTIMATE|DELETE statistics;
sql 优化
1.并行
insert /*+ append parallel(test) */ into test select * from test
2.将指定的表作为连接次序中的首表,一般将大表作为首表
select /*+LEADING(test2)*/ count(1) from test,test2
3.SELECT子句中避免使用*
4.用EXISTS替代IN
5.用NOT EXISTS替代NOT IN
6.用表连接替换EXISTS
7.用EXISTS替换DISTINCT
8.减少对表的查询
9.避免循环(游标)里面嵌查询
10.尽量用union all替换union
11.使用DECODE函数来减少处理时间
(低效)
select count(1) from ac01 where aab001=’100001’and aac008=’1’;
select count(1) from ac01 where aab001=’100001’and aac008=’2’;
(低效)
Select count(1),aac008 From ac01 Where aab001=’100001’ and aac008 in (’1’,’2’) group by aac008;
(高效)
select count(decode(aac008,’1’,’1’,null)) zz, count(decode(aac008,’2’,’1’,null))tx from ac01 where aab001=’100001’;
12.group by优化
13.尽量避免用order by
14.用Where子句替换HAVING子句
15.使用表的别名(Alias)
16.删除重复记录 最高效的删除重复记录方法 (因为使用了ROWID) DELETE FROM ac01 a WHERE a.rowid > (SELECT MIN(b.rowid) FROM ac01 b WHERE a.aac002=b.aac002 and a.aac003=b.aac003 );
17.COMMIT使用 数据转换的程序需要关注这一点。
18.减少多表关联
索引优化
索引的选择
建议一:在基数小的字段上要善于使用位图索引。
建议二:创建索引的一些限制条件。
建议三:多表连接查询的索引设计。
建议四:在表的更新速度与查询速度之间寻求一个平衡点。
1.避免在索引列上使用函数或运算
2.避免改变索引列的类型
3.避免在索引列上使用NOT
4.用>=替代>
5.避免在索引列上使用IS NULL和IS NOT NULL
6.带通配符(%)的like语句,%在常量前面索引就不会使用.
7.总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个列被where子句引用时,优化器才会选择使用该索引。
- oracle优化
- oracle优化
- ORACLE优化
- oracle 优化
- Oracle优化
- Oracle优化
- Oracle 优化
- oracle 优化
- Oracle优化!!
- Oracle优化
- Oracle 优化
- oracle优化
- oracle 优化
- oracle优化
- Oracle 优化
- Oracle优化
- oracle优化
- oracle 优化
- dedecms提示dede_addonarticle` 时出错
- jps - Java Virtual Machine Process Status Tool
- tomcat 配置别名alias
- android-一个简单的手机桌面(GridView+SimpleAdapter)
- shell之awk的编程结构--BEGIN/END/重定向/管道
- oracle 优化
- properties文件自动存盘为Unicode格式(Eclipse插件)
- RoboWorks/RoboTalk学习笔记1
- 个人简介 - HTML/CSS简单页面实例
- (转载)四种常见的 POST 提交数据方式
- 后台零散知识记录1
- java synchronized详解
- 69.You are working on an instance started using the SPFILE. You want to move the Flash Recovery Area
- 最小二乘拟合平面