oracle优化

恰当控制事务大小,commit不要过于频繁。
在OLTP系统中一定要注意使用绑定变量。
谨用或尽量不要使用in/exists、not in/not exists方式,而应该使用直接连接方式替换。
嵌套循环连接中非常大的表作内表(被驱动表)时,其连接字段上需建有索引。
在返回的结果集大于1万行时,不建议使用嵌套循环连接,应考虑使用哈希连接或排序合并连接进行替换。
两个无序大表的连接,在连接字段无索引时,不建议使用合并排序连接。
含有多表的SQL语句,必须明确指定各表的连接条件,以避免产生迪卡尔积。
在执行频度高,又含有排序操作的SQL语句中,建议使用索引来避免排序操作。
在删除(delete)、插入(insert)、更新(update)频繁的表中,建议不要使用位图索引。
在删除(delete)、插入(insert)、更新(update)操作频繁,而数据又来源于序列的字段上建议尽量不要建立索引。
尽量使用前端匹配的模糊查询(like),以通过使用索引来避免全表扫描。
在建立复合索引时,尽量把最常用的字段放在最前面,尽量把离散值较少的字段往前放,同时还要尽量保证复合索引中至少有一个字段具有非空约束。

不要在选择性较低的字段上建立索引。
尽量不要在较长字符串的字段上建立索引,如char(1000)、varchar2(1000)等。
不要在语句的where条件中对字段进行数学表达式运算。
在where条件中对字段使用函数,会导致用不上索引,可以考虑建立函数索引。
在业务逻辑允许的情况下,尽量使用union all来代替union。
如果SQL语句针对同一个字段做多个选择(or)条件,建议考虑使用no_expand提示来避免串联(concatenation)操作。
用case语句合并多次表扫描
慎用distinct、union、order by、group by语句,因为这些语句会引起排序,在无法消除排序的情况下尽量不要使用。
当使用索引产生的逻辑I/O远远大于表扫描时,应该屏蔽索引,如果字段为数值型的就在表达式后面“+ 0”,为字符型的就并上一个“空串”。
删除分区表数据时,建议考虑使用truncate进行整分区的删除。
对于大批量数据的删除,要考虑使用特殊方式处理,不要使用delete方式。

你可能感兴趣的:(oracle,sql)