SQL书写习惯
Oracle解析SQL语句时,会把小写的字母转换成大写的再执行。
例:select *from tempagreement where rownum<10;
SELECT * FROM TEMPAGREEMENT WHERE ROWNUM<10;
两句的查询相差0.5秒
如果为所查询的表起了别名,那么在查表中字段的时候要带上别名,可以减少解析时间
例:SELECTC.C_CODE FROM CITY C
Oracle从右到左处理FROM子句中的表名,所以在FROM子句中包 含多个表的情况下,将记录最少的表放在最后。
例:SELECT * FROM TABLE1 T1, TABLE2 T2
WHERE T1.T_ID=T2.T_ID 表连接语句
AND T1.T=’Y’ 条件语句
从下至上的顺序
包括字母的大小写、标点符号、换行的位置等都要一致
例:SELECT * FROM DUAL;
SELECT * FROM DUAL;
操作符的使用
EXISTS IN OR
NOT EXISTS NOT IN
执行IN子查询时,首先执行子查询,将查询结果放入临时表中再执行主查询
EXISTS则是首先检查主查询,然后运行子查询直到找到匹配项
例:
Select * from city c
Where exists(
select * from airport a where a.ap_code=c.city_code
)
Select * from city c
Where c.city_code in(
select * from airport a
);
GROUP BY DISTINCT
滤掉多余的重复记录只保留一条,但是执行效率极差。
UNION与UNION ALL
有重复:UNION,筛选重复记录,再进行排序
无重复:UNION ALL,两个结果合并
LIKE
LIKE ‘%CA809%’ 不走索引
LIKE ‘%CA809’ 不走索引
LIKE ‘CA809%’ 走索引
“>=”和“<=” BETWEEN
使用BETWEEN,会先转换为“>=”和“<=”
ORDER BY
1)ORDER BY中所有列必须包含在相同的索引中,并保持在索引中的排列顺序。
2)ORDER BY中所有的列必须定义为非空。
GROUP BY
避免使用HAVING子句再次筛选。
索引的使用
索引是用来提高检索数据的效率,通过索引查询数据比全表扫描要快很多。
索引不足:
Ø 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
Ø 索引需要占物理空间
Ø 当对表中的数据进行增加、删除和修改的时候,索引也会动态维护,这样就降低了数据更的速度
索引的限制:
Ø 避免在索引列上使用NOT。当Oracle遇到NOT时,他会停止使用索引转而执行全表扫描。
例:where not time1 >=to_date(sysdate-1,’yyyymmdd’)
Ø 避免在索引列上使用计算。
例:Where time1>time2
Ø 避免在索引列上使用函数。
例:where trunc(time1,’dd’)
Ø 避免在索引列上使用ISNULL和IS NOT NULL,索引将会失效。
例:where time1 is null / where time1 is not null
Ø 避免在索引中使用任何可以为空的列,索引将会失效。
Ø 如果是组合索引,总是使用索引的第一列。只有第一列被WHERE子句引用时,优化器才会选择使用该索引。当仅引用索引的第二列时,优化器使用全表扫描而忽略了索引。
例:b_code,ta_id,sac_id 是联合索引,where ta_id=2
Ø 避免改变索引列的类型。
例:where to_char(time1,’yyyymmdd’)=‘20131010’
Ø 避免使用“<>”或者“!=”操作符
例:where time1<>trunc(sysdate,’dd’)
Ø 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用
例:where code like ‘%华北’ / where code like ‘_华北’
Ø 对于有连接的列“||”,最后一个连接列索引会无效
不应建索引的情况:
Ø 对于那些在查询中很少使用或者参考的列不应该创建索引
Ø 对于那些只有很少数据值的列也不应该增加索引
Ø 对于那些定义为blob数据类型的列不应该增加索引
Ø 当修改性能远远大于检索性能时,不应该创建索引