性能优化之SQL优化经验总结3: 提高单条SQL语句效率的几条经验

这篇文章可能就是作为一个记录, 一条一条的写, 没有太多的组织和归类, 算是一条条的经验吧. 主要总结一下提高单条SQL语句执行效率的一些手段和注意点:

  1. SQL Sever 2008里面的SQL Server Profiler工具是很好用的, 对于每一条抓到的SQL语句都可以查看CPU, Read, Write, Duration(ms), 也就是CPU的占有率, Read/Write读写磁盘, 以及Duration这条SQL语句的执行时间.
  • 当然如果这里你偶尔发现了一条普通的SQL语句duration有几十个毫秒, 这个时候就要看了, 是不是因为其他原因, 比如机器上有其他用户进行了数据库操作, 或者其他程序导致的. 不能直接断定这条SQL语句就是瓶颈所在.
  1. 善用Execution Plan查看某一条SQL语句执行起来哪一个stage(Select, Index Seek, Key Lookup, etc.)最耗时, 然后针对性优化, 比如Where太慢是不是可以加index, 或者Top比较慢是不是可以不需要排序.

  2. 对于频繁查询的字段可以建立索引Index用空间换时间.

  3. where X in (SELECT … FROM … WHERE) 其中X是某个表子段, 这种where X in (SELECT … FROM … WHERE) 查询条件当(SELECT … FROM … WHERE) 到达一定的数量级以后, 这个查询就会变得很慢, 要慎用!

  4. 比较运算符的效率是  (=等于操作符) Faster than (<, >, >=, <=) Faster than (like, not exists) faster than (<>不等操作符)

  5. 当需要找到某一个结果集里面某个字段最大的那条记录的时候, 方法一是Select Top 1 from tbl order by DESC这种方法, 方法二是使用MAX操作, 但是MAX操作的缺点是不能拿到整个记录集, 只能拿到取MAX的那个字段的值. 如果要取得整条记录, 可能要使用复合语句查询, 先找啊MAX在使用IN挑选出那条字段A最大值就是MAX的记录. 笔者的经验是可能还是使用MAX的效率高一点 (可以在取MAX的字段加index提高效率).

  6. 尽量避免Select *,  只Select那些真实需要的字段.

  7. 如果对于表A上面有字段B, C加了索引index, 在表A上进行对B, C的查询的时候, Select部分如果只含有字段B, C, 那这是相当高效的, 如果Select里面有除了索引字段B或者C意外的字段, 这个索引的效率会打折扣. 所以如果对索引字段进行查询, 那么Select里面只放被查询的索引字段这样的效率是最高的, 如果有多余字段, 所以的效率会打折.

Written on July 14, 2014