Oracle中SQL语句注意事项

来源:互联网 发布:sql restoring 编辑:程序博客网 时间:2024/05/07 23:34

 Mr Hu:

1. Existsin 的效率大多数时候都会高,但也只是大多数,具体在选择INEXIST操作时,要根据主子表数据量大小来具体考虑。

2. Not in最好不要出现,这个玩意的效率实在太低了,可以用 minus 或则not exists代替。

3. is nullis not null以及not应避免在索引列上使用

4. 索引列在where条件中时,不要用to_char,to_date,upper,等方法进行格式转换。一些转换呀计算操作尽量放=右边

5. != <>可以替换成< or >

6. 多个字段的联合索引,貌似只有用到第一个列的时候索引才会起作用

7. 类型呀状态呀什么的字段位图索引比普通索引有效些

8. select * select 所有列 慢多少不知道,不过也不会比select所有列快。但count*)貌似却是所有count方式中最快的

9. 使用子查询时,尽量减少对表的查询

 

Mr Pan:

1、防止2张大表关联查询。
2、尽量把sql语句写成 dm=? ,然后再赋值,而不是直接dm=9,这样oracle每次执行都要编译这条语句,而前面的那种方法,oracle只编译一次。
3、过多的利用全匹配(%%),需要时可以用前匹配(%)
4、建表是不要贪图方便把所有字段都放到一个表中,这样表空间会很大,查询速度会很慢,要明确“哪些字段和常用,哪些字段不常用”,尽量把不常用的字段放在附表里面,与主表一对一关联。
5、不要把很复杂的逻辑梦想着用一条语句来实现,有时候把一条语句拆开来会提速很多。
6、也不要太依赖于建索引,现在有的人喜欢到处建索引来提高查询性能,索引一多,在编辑表的时候会出现很多“数据库锁”,查询速度上去了,但是业务相关操作的速度会变慢。
7、查询统计当中,发现分页count(*)操作要比查询列表数据更加慢,可以学习一期,先出来列表,下面的分页信息通过异步获得,起初可以输出“计算中”,这样用户会感觉快一点。
8、查询中语句不要用数据库端得格式转换,比如upper(),后面查询条件又引用到该字段,这样会出现全表扫描。
9、适当的冗余一些数据,这样在设计表的时候虽然不舒服,但是可以提高很多新能。
 
Mr Liu:
1              尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。 
2
   不用NOT IN操作符,可以用NOT EXISTS或者外连接+(外连接+判断为空)替代。

3
   不用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替。例如:a<>0 改为 a>0 or a<0a<>’ ’ 改为
a>’ ’
4
   Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作。

5
   当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用,因此一般不要作为第一个字符出现。

6
   对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。

7
   如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。

8
   Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。

9
   对数据类型不同的列进行比较时,会使索引失效。

10
  “>=”替代“>”

11
  UNION操作符会对结果进行筛选,消除重复,数据量大的情况下可能会引起磁盘排序。如果不需要删除重复记录,应该使用UNION ALL

12
  Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。

13
  Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。

14
  Order By语句中的非索引列会降低性能,可以通过添加索引的方式处理。严格控制在Order By语句中使用表达式。
15
  不同区域出现的相同的Sql语句,要保证查询字符完全相同,以利用SGA共享池,防止相同的Sql语句被多次分析。

16
  多利用内部函数提高Sql效率。

17
  当在Sql语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解析时间。

18
  根据SQL不同设定优化模式的方式,选择不同的优化策略,通过SELECT /*+ALL+_ROWS*/ ……;来设定。可用的HINT包括/*+ALL_ROWS*//*+FIRST_ROWS*//*+CHOOSE*//*+RULE*/ 等一般在SQL前加first_rows策略,速度都会提高,特殊情况下改用choose策略。(本策略架构包已经支持)

19
  对于大表查询中的列应尽量避免进行诸如To_char,to_date,to_number等转换
20
  有索引的尽量用索引,有用到索引的条件写在前面
21
  如有可能和有必要就建立一些索引
22
  尽量避免进行全表扫描,限制条件尽可能多,以便更快搜索到要查询的数据
原创粉丝点击