1.避免使用count(*)得到表的记录数java
(1)为了得到表中的记录数,咱们一般使用下面的SQL语句:sql
SELECT COUNT(*) FROM dbo.orders
这条语句会执行全表扫描才能得到行数。oracle
(2)但下面的SQL语句不会执行全表扫描同样能够得到行数:函数
SELECT rows FROM sysindexes WHERE id =OBJECT_ID('dbo.Orders') AND indid <2
2.使用union实现or操做性能
(1)在查询中尽可能不要使用or,使用union合并两个不一样的查询结果集,这样查询性能会更好;spa
(2)若是不是必需要不一样的结果集,使用union all效果会更好,由于它不会对结果集排序。code
3.索引问题排序
法则:不要在创建的索引的数据列上进行下列操做:索引
◆避免对索引字段进行计算操做io
◆避免在索引字段上使用not,<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出现数据类型转换
◆避免在索引字段上使用函数
◆避免创建索引的列中使用空值。
4.NOT IN操做符
此操做是强列推荐不使用的,由于它不能应用表的索引。
推荐方案:用NOT EXISTS 或(外链接+判断为空)方案代替
5.<> 操做符(不等于)
不等于操做符是永远不会用到索引的,所以对它的处理只会产生全表扫描。
推荐方案:用其它相同功能的操做运算代替,如
a<>0 改成 a>0 or a<0
a<>’’ 改成 a>’’
IS NULL 或IS NOT NULL操做(判断字段是否为空)
判断字段是否为空通常是不会应用索引的,由于B树索引是不索引空值的。
6.LIKE操做符
LIKE操做符能够应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,可是若是用得很差则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,若是改为YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能确定大大提升。
7.用EXISTS替换DISTINCT:
当提交一个包含一对多表信息(好比部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 通常能够考虑用EXIST替换, EXISTS 使查询更为迅速,由于RDBMS核心模块将在子查询的条件一旦知足后,马上返回结果. 例子:
(低效):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E
WHERE D.DEPT_NO = E.DEPT_NO
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
8. sql语句用大写的;由于oracle老是先解析sql语句,把小写的字母转换成大写的再执行