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
子句引用时
,
优化器才
会选择使用该索引
.
当仅引用索引的第二个列时
,
优化器使用了全表扫描而忽略了索引
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
假如索引是建立在多个列上, 只有在它的第一个列(leading column)被WHERE子句引用时,优化器才会选择使用该索引. 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
12.查两张以上表时,把记录少的放在右边;
13.减少对表的访问次数;
14.有where子查询时,子查询放在最前;
15.避免在索引列上使用is null和is not null避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。对于单列索引,如果列包含空值,索引中将不存在此记录;对于复合索引,如果每个列都为空,索引中同样不存在此记录;如果至少有一个列不为空,则记录存在于索引中。
16. 用TRUNCATE替代DELETE
17.通过内部函数提高SQL效率复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的
18. 避免在索引列上使用NOT,计算,IS NULL
用UNION替换OR(适用于索引列)
19.用UNION-ALL
20.
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 ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
会将
'*'
依次转换成所有的列名
会将
'*'
依次转换成所有的列名