oracle sql语句的优化

1.select查询避免使用*,尽量使用具体的列,不然oracle解析会将'*' 依次转换成所有的列名。

2

Where

子句替换

HAVING

子句

.用Where子句替换having子句 

用WHERE替代ORDER BY

  ORDER BY 子句只在两种严格的条件下使用索引.
  ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
  ORDER BY中所有的列必须定义为非空.
  WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

   某些SELECT 语句中的WHERE子句不使用索引

  例子:
  (1)‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
  (2) ‘||’是字符连接函数. 就象其他函数那样, 停用了索引.
  (3) ‘+’是数学函数. 就象其他数学函数那样, 停用了索引.
  (4)相同的索引列不能互相比较,这将会启用全表扫描

3.多表连接查询使用表别名。

4.用EXISTS替代IN、用NOT EXISTS替代NOT IN

5.用EXISTS替换DISTINCT

6.SQL语句用大写的 
因为Orale总是先解析SQL语句,把小写的字母转换成大写的再执行

7、避免在索引列上使用NOT: 
ORACLE”碰到”NOT,他就会停止使用索引转而执行全表扫描

11

、用

>=

替代

高效

:SELECT * FROM EMP WHERE DEPTNO >=4  

低效

:SELECT * FROM EMP WHERE DEPTNO >3  

两者的区别在于

前者

DBMS

将直接跳到第一个

DEPT

等于

4

的记录而后者将首先定位到

DEPTNO=3

的记

录并且向前扫描到第一个

DEPT

大于

3

的记录

12

、用

IN

来替换

OR 

低效

: SELECT... FROM LOCATION WHERE 

LOC_ID = 

10 

OR LOC_ID 

= 20 OR LOC_ID = 30 

高效

 SELECT

 

FROM LOCATION WHERE LOC_IN IN (10,20,30); 

13

、避免在索引列上使用

IS NULL

IS NOT NULL 

避免在索引中使用任何可以为空的列,

ORACLE

将无法使用该索引.对于单列索引,假如列包含空值,

索引中将不存在此记录

对于复合索引,假如每个列都为空,索引中同样不存在此记录

14

、总是使用索引的第一个列

 

假如索引是建立在多个列上

只有在它的第一个列

(leading column)

WHERE

子句引用时

,

优化器才

会选择使用该索引

当仅引用索引的第二个列时

,

优化器使用了全表扫描而忽略了索引

8、用>=替代> 
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录. 
9、用IN来替换OR,WHERE替代ORDER BY 
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,假如列包含空值,索引中将不存在此记录. 对于复合索引,假如每个列都为空,索引中同样不存在此记录. 
10、总是使用索引的第一个列 
假如索引是建立在多个列上, 只有在它的第一个列(leading column)被WHERE子句引用时,优化器才会选择使用该索引. 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引
11.使用Decode函数来减少处理时间:
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

12.查两张以上表时,把记录少的放在右边;

13.减少对表的访问次数;

14.有where子查询时,子查询放在最前;

15.避免在索引列上使用is null和is not null避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。对于单列索引,如果列包含空值,索引中将不存在此记录;对于复合索引,如果每个列都为空,索引中同样不存在此记录;如果至少有一个列不为空,则记录存在于索引中。

16. 用TRUNCATE替代DELETE

17.通过内部函数提高SQL效率复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的

18. 避免在索引列上使用NOT,计算,IS NULL和IS NOT NULL,!=,%,类型转换导致的索引失效

用UNION替换OR(适用于索引列)

19.用UNION-ALL 替换UNION:UNION两个结果集合会以UNION-ALL的方式被合并,如果用UNION ALL替代UNION, 这样排序就不是必要了

20.避免改变索引列的类型.:当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. 

21. 避免使用耗费资源的操作:
  带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎
  执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
22 优化GROUP BY:
  提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果

23.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

24:where 子句中对字段进行 null 值判断,子句中使用!=或<>操作符,or 来连接条件,变量的值还是未知的,in 和 not in 也要慎用,Like,字段进行表达式操作,表达式操作,字段进行函数操作。多改避免。不然多会导致全表查询;

例如:

select id from t where num=0

select id from t where num=10 or num=20

正确:

select id from t where num=10
union all
select id from t where num=20

select id from t where num in(1,2,3)

正确:select id from t where num between 1 and 3

select id from t where name like '%abc%'

正确:若要提高效率,可以考虑全文检索。

select id from t where num=@num

正确:select id from t with(index(索引名)) where num=@num

select id from t where num/2=100

正确:select id from t where num=100*2

select id from t where substring(name,1,3)='abc'

正确:select id from t where name like 'abc%'

25:索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要

26.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

27.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。





会将

'*' 

依次转换成所有的列名

会将

'*' 

依次转换成所有的列名

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

morris131

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值