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/