1. 需要哪此字段就选择哪此字段,不要用Select *且不设置过滤条件,Select count(*)是可以用的。
    2. Exists后跟子查询时,其Select后可用星号,因为其只返回True和False,并不返回数据。
    3. Distinct和Order By等语句尽量是查询结果需要才使用。Union All较Union有效,因为Union会剔除重复的记录,就需要加入类似Distinct的演算方式。
    4. 将大表先进行过滤再存入CTE或临时表,后面利用CTE或临时表来进行连接等操作。
    5. 若未将联机交易层级降到Read Uncommitted,或是通过锁定提示NoLock来减少被锁定的机会,最好设置Set Lock_TimeOut选项,避免用户无尽的等待。
    6. 不要在Where子句对字段作运算,不要在Where子句对字段使用函数。
    7. 不要负向查询(NOT、!=、<>、!>、!<、NOT Exists、NOT in、NOT like、Like %***)。
    8. 在And条件中,只要一个子句有合适的索引就可以大幅提升查询的速度。OR操作,则需要所有子句都有可用的索引。
    9. Select into 比逐条Insert要快,清空数据表采用Truncated Table一定比Delete Table不含Where来得快。
    10. 当Update和Delete采用Where子句时,条件也得符合SARG格式。
    11. 某些情况下使用CTE来简化查询语句比使用临时表或表变量效率要高很多。
    12. 在查看SQL语句的优化效果时,可以使用如下一些命令:

    DBCC FREEPROCCACHE --清除执行计划缓存

    DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS --清除缓冲区

    Set statistics IO on --查看IO情况

    Set statistics Time on --查看耗时情况

    查看Sql语句的实际执行计划

    查看Sql语句的客户端统计信息

posted on 2009-12-07 20:18  znyin  阅读(248)  评论(0编辑  收藏  举报