T - Sql 优化

1  第一点也许是非常明显的,但是有时候你可能还是会不大注意,那就是尽量给select语句加上where条件。如果没有这样做,那么Sql server将不得不通过一个完全的表扫描来返回需要的行。如果返回所有行,包括你不需要的数据,至少会带来2个坏处。一方面,将占用Sql server服务器的资源,因为多余的I/O会带来对应的开销。另一方面,将增加网络传输的拥塞,某种意义上也降低了Sql server的性能。除此之外,如果要查询的表很大,将可能导致表被锁住,这也妨碍了其他人的访问。

   2  当使用Union语句的时候,千万记得Union本身是会在结果集里去掉重复行的。Union操作会对结果集执行一个并操作,然后通过类似select distinct的语句,只取重复行中的一行。

   3  对于Union,如果允许重复行,请使用Union all。Union all语句将不会执行剔除重复行的操作,也就是会返回所有的行。同时,如果你明确知道Union的结果集中不会有重复行的话,你也可以使用Union all,因为比union少一个剔除重复的动作,在性能上会有更好的表现。

 4   如果能确保查询结果里不会有重复行,就可以使用select而不是select distinct 。多一个distinct将会给Sql server带来许多额外的开销,就像Union 之于Union all。

   5  如果只用返回一部份数据,也许只是第一条数据,可以使用top。比如 select top 1 * from table1 where name='flyfox',将只会返回table1里name为flyfox的第一条记录。你也可以使用top percent,按照百分比返回结果,如过满足条件的总行数*百分比不是整数,将向上取整。

比如select top 10 percent * from table1 where .......,将返回满足条件的记录的10%,如果有11条满足条件,将返回前2条。此外,使用set rowcount也有类似的效果。

   6  在where查询条件里,按照以下顺序使用运算符:最优先使用的是=,其次是>, >=, 。因为<>将会带来表扫描,而=扫描的记录会更少。

   7 对于多个查询提交的语句,优先将容易判断,可以去掉许多记录的条件放在前面。通常而言,其出现的次序是无所谓的。因为Sql server查询优化器将在内部进行优化。但是并不总是这样。因此,如果可能的话,尽量将容易为真,将容易判断的and条件放在前面。如此一来,将更快的剔除记录,节省时间。

   8  尽量避免在where条件里使用非聚合表达式。原因是非聚合表达式很难利用到索引,通常Sql server不得不进行大规模的扫描。像"IS NULL", "<>", "!=", "!>", "!

   9  对于相当一部分非聚合表达式,可以通过优化Tsql语句的写法,改为聚合条件。如where not id>5 可以改为 where id<=5

where substring(name,1,1) = 'z' 可以改为where name like 'z%'

where datediff(yy,birthdate,getdate()) > 1可以改为where birthdate< dateadd(yy,-1,getdate())

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23155850/viewspace-667368/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23155850/viewspace-667368/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值