Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 综合其它

【SQL语句】SQL书写过程中,影响SQL效率的因素

时 间:2013-11-18 12:33:12
作 者:nivenm   ID:29828  城市:无锡
摘 要:效率,SQL
正 文:

SQL书写过程中,影响SQL效率的因素
   
    昨天值班有位学员要查找某一列为空值的记录,一开始不会写,最终用 is null 来解决,可我下了班想想,用is null肯定会影响执行效率,于是找到这篇文章,与各位学员分享。。。

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%';

4.order by 语句

任何在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和EXISTS

将一列和一系列值相比较,最简单的办法就是在where子句中使用子查询,在where子句中可以使用两种格式的子查询。

第一种使用In操作符:

where column in(select column from .. where ..);

第二种使用exists;

where column exists (select column from .. where ..);

相信绝大多数人会使用第一种形式,因为比较容易编写,而实际上第二种形式要比第一种形式效率高很多。在oracle中可以几乎将所有的in操作符子查询改为使用exists的子查询。



Access软件网官方交流QQ群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助