SQL性能优化

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语句,把小写的字母转换成大写的再执行

相关文章
相关标签/搜索