SQL书写过程中,影响SQL效率的因素2010-09-25
1.IS NULL与IS NOT NULL
不能用null作为索引,任何包含null值的列都将不会被包含在索引中,即使索引有多列的情况下,只要这些列中有一列包含有null,该列就会从索引中排除。即如果某列存在空值,即使对该列建索引也不会提高性能。
2.对于连接列,即使最后的联接值是一个静态值,优化器是不会使用索引的。
3.带通配符(%)的like的语句。
如下语句:
select * from A where name like ‘%name%’;
这里由于通配符(%)在搜索词首出现,所以oracle系统不使用name的索引,在很多情况下,可能无法避免这种情况。但是通配符如此使用会降低查询速度。当通配符出现在字符串其他位置时,优化器就能利用索引进行查询:select * from A where name like 'name%';
任何在order by 语句中的非索引项或者计算表达式都会降低查询的速度。
5.NOT
在查询时,经常在where子句中使用逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)运算符。即使不在查询where子句中显示的加入not词,not仍在运算符中,如下:
select * from A where price <>3000;
对于上面的查询可以改写为不使用not:
select * from A where price>3000 or price <3000;
虽然上面的查询结果一样,到那时第二种查询方案会比第一种查询方案更快一些,第二种允许对price使用索引。
6.IN和EXISTSsql语句查询不包含
将一列和一系列值相比较,最简单的办法就是在where子句中使用子查询,在where子句中可以使用两种格式的子查询。
第一种使用In操作符:
where column in(select column from .. where ..);
第二种使用exists;
where column exists (select column from .. where ..);
相信绝大多数人会使用第一种形式,因为比较容易编写,而实际上第二种形式要比第一种形式效率高很多。在oracle中可以几乎将所有的in操作符子查询改为使用exists的子查询。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论