Oracle 数据库优化
Posted supper李狗嗨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 数据库优化相关的知识,希望对你有一定的参考价值。
Oracle 数据库优化
信息管理部
目录
一、 SELECT查询语句中避免使用 ‘*’.................................................... 2
二、 减少数据库访问次数:............................................................................. 2
三、 查询单条记录............................................................................................... 2
四、 选择最优表名顺序:................................................................................. 2
五、 WHERE子句中的连接............................................................................... 3
六、 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表 3
七、 删除全表操作推荐使用TRUNCATE不建议使用DELETE............. 3
八、 尽量多使用COMMIT:............................................................................ 4
九、 减少对表的查询:...................................................................................... 5
十、 通过内部函数提高SQL效率.:............................................................ 5
十一、 使用表的别名(Alias):.......................................................................... 5
十二、 对常用查询条件设置索引................................................................... 5
十三、 sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行.................................................................................................................... 6
十四、 在java代码中尽量少用连接符“+”连接字符串!............... 6
十五、 避免在索引列上使用NOT.................................................................. 6
十六、 避免在索引上使用计算........................................................................ 6
十七、 用>=替代>............................................................................................... 6
十八、 用UNION替换OR (适用于索引列)................................................ 6
十九、 普通查询中用IN来替换OR.............................................................. 7
二十、 避免在索引列上使用IS NULL和IS NOT NULL.......................... 7
二十一、 总是使用索引的第一个列:.......................................................... 7
二十二、 用UNION-ALL 替换UNION ( 如果有可能的话):............. 7
二十三、 避免改变索引列的类型.:................................................................. 7
二十四、 某些WHERE子句不使用索引....................................................... 7
二十五、 避免使用耗费资源的操作:.............................................................. 8
二十六、 优化GROUP BY.................................................................................. 8
二十七、 .................................................................................................................. 8
一、SELECT查询语句中避免使用 ‘*’
二、减少数据库访问次数:
减少数据库IO操作压力
三、查询单条记录
四、选择最优表名顺序:
Oracle解析器解析规则从右向左的顺序处理From子句表名,此时宜将记录条数最少的表或者交叉表(被其他引用的表)作为基础表(From子句中写最后的表)
五、WHERE子句中的连接
Oracle解析器解析WHERE子句采用从下到上的顺序解析,过滤大量数据的筛选条件推荐写在WHERE子句最后
六、使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表
七、删除全表操作推荐使用TRUNCATE不建议使用DELETE
TRUNCATE将会彻底删除数据不可恢复,消耗资源小于DELETE。
① 在功能上,truncate是清空一个表的内容,它相当于delete from table_name
② delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback(回滚),占用很多的rollback segments(回滚段), 而truncate不会
③ 在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!
④ truncate 调整high water mark 而delete不;truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)delete 则不可以。
⑤truncate只能对TABLE,delete 可以是table,view,synonym
⑥TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限
⑦在外层中,truncate或者delete后,其占用的空间都将释放
⑧truncate和delete只删除数据,而drop则删除整个表(结构和数据)
小技巧:在删除大数据量时(一个表中大部分数据时),
先将不需要删除的数据复制到一个临时表中;
trunc table 表;
将不需要删除的数据复制回来。
八、尽量多使用COMMIT:
尽可能使用COMMIT需求释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
九、减少对表的查询:
在含有子查询的SQL语句中,要特别注意减少对表的查询..
十、 通过内部函数提高SQL效率.:
复杂的SQL往往牺牲了执行效率. 更倾向于运用函数解决问题
十一、使用表的别名(Alias):
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
十二、对常用查询条件设置索引
索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的:
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
十三、sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行
十四、在java代码中尽量少用连接符“+”连接字符串!
十五、避免在索引列上使用NOT
NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
十六、避免在索引上使用计算
索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
十七、用>=替代>
数据记录处理机制问题
十八、用UNION替换OR (适用于索引列)
用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低
十九、普通查询中用IN来替换OR
二十、避免在索引列上使用IS NULL和IS NOT NULL
尽量避免在字段信息中出现空值,在索引中出现空值字段会导致ORACLE无法使用该索引
二十一、总是使用索引的第一个列:
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引
二十二、 用UNION-ALL 替换UNION ( 如果有可能的话):
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了
UNION ALL 将重复输出两个结果集合中相同记录,所以请根据具体需求使用。
二十三、避免改变索引列的类型.:
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. .
二十四、某些WHERE子句不使用索引
(1)‘!=‘ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
(2)‘||‘是字符连接函数. 就象其他函数那样, 停用了索引.
(3)‘+‘是数学函数. 就象其他数学函数那样, 停用了索引.
(4)相同的索引列不能互相比较,这将会启用全表扫描.
二十五、 避免使用耗费资源的操作:
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.
二十六、 优化GROUP BY
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉
以上是关于Oracle 数据库优化的主要内容,如果未能解决你的问题,请参考以下文章