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 之前过滤掉

猜你喜欢

转载自www.cnblogs.com/supperlhg/p/8963399.html