在用SQL语句对数据库进行查询的时候,由于SQL语句写法的不同,影响查询的速度也很大,所以就SQL语句的一些优化作以下总结。我们都知道,写SQL语句的时候基本上都会用到where子句的,在where子句中由于写的SQL语句不同会导致不能使用表中列设置的索引,同样会进行全表的查询,导致查找速度降低。

1、       ISNULL 与IS NOT NULL

任何SQL语句,只要在where子句中使用了is null或is not null,那么Oracle优化器就不允许使用索引了。

2、       联接列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。比如:

select* from employss   where first_name||''||last_name='Beill Cliton';

3、       带通配符(%)的like语句

比如:

select* from employee where last_name like '%cliton%';

由于通配符(%)在查找关键字的第一位出现,所以Oracle系统不使用last_name的索引。有时候有可能无法避免这种情况,但是我们一定要清楚的知道通配符如此使用会大大地降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。比如:

select* from employee where last_name like 'c%';

4、       Orderby 语句

ORDERBY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。  仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

5、       Not

在SQL语句中如果使用到了NOT或者<>运算符,那么这种查询将不使用索引,我们应该把其分成>and<来写,这样就能对列使用索引了。

6、       IN和EXISTS

有时候我们会在查询的时候将一列和一系列值相比较,这时候我们会用到IN和EXISTS关键字,对于它们的使用,第二个比第一个效率高。通过使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。  同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。

7、       FROM多表的顺序

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。

8、       WHERE子句中的连接顺序

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

9、       SELECT子句中避免使用“*”

ORACLE在解析的过程中, 会将 * 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

10、    减少访问数据库的次数

ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等,所以减少数据库的访问次数可以很大的提高查询的效率。

11、    使用DECODE函数来减少处理时间

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

 decode()函数简介:

主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);

使用方法:

Selectdecode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

Fromtalbename

Where …

其中columnname为要选择的table中所定义的column,

·含义解释:

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)的理解如下:

if (条件==值1)
 then    
return(翻译值1)
elsif (条件==值2)
then    
return(翻译值2)    
......
elsif (条件==值n)
 then    
return(翻译值n)
else    
return(缺省值)
end if

注:其中缺省值可以是你要选择的column name 本身,也可以是你想定义的其他值,比如Other等。