欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » SQLServer教程 » 正文

热门阅读

浅谈SQL语句优化的几种方法(二)

创建时间:2011年09月02日 15:31  阅读次数:(6986)
分享到:
1,慎用distinct关键字
在上一节中我们有讲到可以使用distinct关键字来优化sql查询,但同时我们又讲到要慎用distinct关键字。如果我们查询的字段只有一个或者很少量的字段,那么就可以使用它。但如果我们的select中有大量的字段,那么该关键字会大大降低查询的效率,这是因为使用distinct关键字后,sql引擎会在结果集中对所有的结果根据distinct后的列排序过滤等大量的工作,如果查询结果中的列多了,那么排序的复杂性就会呈几何倍数的增加,查询效率自然就会明显的降低了。

我们来看下面的select语句,并查看执行所需的时间。
select id,gid,name,did,model,unit from table1

在小编的计算机中执行时间为36秒。

我们再在select中使用distinct关键字,sql语句如下:
select distinct id,gid,name,did,model,unit from table1

显然,这条sql会比上条sql查询出的结果要少,但在小编的计算机中却执行了2分钟。可见,distinct会多影响查询效率了。

2,慎用union关键字
union的功能是将多个结果集合成一个结果集,它要求合并的多个结果集的列数与列的数据类型相同。同时它会在合并后过滤掉相同行的数据。正因为它会过滤掉相同行的数据,所在它在合并后会有一系列复杂的排序过滤等动作,所distinct关键字一行,多个字段的排序与对比是很耗时的。我们推荐使用union all来代替union,虽然union不过滤相同的行,但其实在大部分情况下,我们都是不需要过滤相同行的。

3,不要在in关键字中使用子查询
如果in关键字中是常量,如 where name in ('a','b','c')这种没有关系。但尽量避免用where name 
in (select name from table1)这样的查询条件。因为在in关键字中使用子查询后是无法使用索引的。

4,不要在like中用左包含%与全包含%
如 where like '%xxx' 与 where like '%xxx%'。原因也是因为在like中用了左包含%与全包含%后无法使用索引,但右包含%没关系。

5,不要在where条件中使用函数
同样原因,在where条件中使用函数会导致索引不可用。 

下面给出所有会导致索引不可用的情况:
(1)对索引列使用了函数或计算
(2)对索引列使用了Like '%X' 或Like '%X%'
(3)在组合索引的第1列不是使用最多的列
(4)在Where子句中使用了In(子查询)
(5)数据类型转换将导致不能利用索引
(6)负向比较将导致不能利用索引00
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 12+14=? 的结果(结果是:26)
结  果: