SERVER中一些常见性能问题的总结

1. 对查询进 化, 尽量避免全表 描,首先   where     order   by   涉及的列上建立索引。  
   
  2.
尽量避免在   where   子句中 字段   null   判断,否 致引擎放弃使用索引而 行全表 描,如:  
  select   id   from   t   where   num   is   null  
 
可以在 num 置默 认值 0 ,确保表中 num 列没有 null ,然 这样查询  
  select   id   from   t   where   num=0  
   
  3.
尽量避免在   where   子句中使用 != <> 操作符,否 将引擎放弃使用索引而 行全表 描。  
   
  4.
尽量避免在   where   子句中使用   or   接条件,否 致引擎放弃使用索引而 行全表 描,如:  
  select   id   from   t   where   num=10   or   num=20  
 
可以 这样查询  
  select   id   from   t   where   num=10  
  union   all  
  select   id   from   t   where   num=20  
   
  5.in  
  not   in   也要慎用,否 致全表 描,如:  
  select   id   from   t   where   num   in(1,2,3)  
 
连续 的数 ,能用   between   就不要用   in   了:  
  select   id   from   t   where   num   between   1   and   3  
   
  6.
下面的 查询 也将 致全表 描:  
  select   id   from   t   where   name   like   '%abc%'  
 
若要提高效率,可以考 全文 索。  
   
   
7. 如果在   where   子句中使用参数,也会 致全表 描。因 SQL 只有在运行 才会解析局部 量,但 化程序不能将 访问计 划的 选择 到运行 ;它必 编译时进 选择 。然而,如果在 编译时 建立 访问计 划, 量的 值还 是未知的,因而无法作 索引 选择 。如下面 句将 行全表 描:  
  select   id   from   t   where   num=@num  
 
可以改 为强 查询 使用索引:  
  select   id   from   t   with(index(
索引名 ))   where   num=@num  
   
  8.
尽量避免在   where   子句中 字段 行表达式操作, 致引擎放弃 使用索引而 行全表 描。如:  
  select   id   from   t   where   num/2=100  
 
:    
  select   id   from   t   where   num=100*2  
   
  9.
尽量避免在 where 子句中 字段 行函数操作, 致引擎放弃使用索引而 行全表 描。如:  
  select   id   from   t   where   substring(name,1,3)='abc'--name
abc id  
  select   id   from   t   where   datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’
生成的 id  
 
:  
  select   id   from   t   where   name   like   'abc%'  
  select   id   from   t   where   createdate>='2005-11-30'   and   createdate<'2005-12-1'  
   
  10.
不要在   where   子句中的 “=” 边进 行函数、算 运算或其他表达式运算,否 将可能无法正确使用索引。  
   
  11.
在使用索引字段作 条件 ,如果 索引是复合索引,那么必 使用到 索引中的第一个字段作 条件 才能保 使用 索引,否 则该 索引将不会被使用,并且 尽可能的 字段 序与索引 序相一致。  
   
 
12. 不要写一些没有意 查询 ,如需要生成一个空表 构:  
  select   col1,col2   into   #t   from   t   where   1=0  
 
这类 不会返回任何 果集,但是会消耗系 统资 源的, 改成 这样  
  create   table   #t(...)  
   
  13.
很多 候用   exists   代替   in   是一个好的 选择  
  select   num   from   a   where   num   in(select   num   from   b)  
 
用下面的 句替  
  select   num   from   a   where   exists(select   1   from   b   where   num=a.num)  
   
  14.
并不是所有索引 对查询 都有效, SQL 是根据表中数据来 查询优 化的,当索引列有大量数据重复 SQL 查询 可能不会去利用索引,如一表中有字段 sex male female 几乎各一半,那么即使在 sex 上建了索引也 对查询 效率起不了作用。  
   
  15.
索引并不是越多越好,索引固然可以提高相   select   的效率,但同 也降低了   insert     update   的效率,因   insert     update   有可能会重建索引,所以怎 建索引需要慎重考 具体情况而定。 一个表的索引数最好不要超 6 个,若太多 则应 一些不常使用到的列上建的索引是否有 必要。  
   
  16.
尽可能的避免更新   clustered   索引数据列,因   clustered   索引数据列的 序就是表 记录 的物理存 储顺 序,一旦 致整个表 记录 序的 整,会耗 相当大的 源。若 用系 需要 繁更新   clustered   索引数据列,那么需要考 是否 索引建   clustered   索引。  
   
  17.
尽量使用数字型字段,若只含数 信息的字段尽量不要 设计为 字符型, 会降低 查询 接的性能,并会增加存 是因 引擎在 查询 会逐个比 字符串中每一个字符,而 于数字型而言只需要比 一次就 了。  
   
  18.
尽可能的使用   varchar/nvarchar   代替   char/nchar   ,因 首先 变长 字段存 小,可以 省存 ,其次 查询 ,在一个相 对较 小的字段内搜索效率 然要高些。  
   
 
19. 任何地方都不要使用   select   *   from   t   ,用具体的字段列表代替 “*” ,不要返回用不到的任何字段。  
   
 
20. 尽量使用表 量来代替 临时 表。如果表 量包含大量数据, 注意索引非常有限(只有主 索引)。  
   
  21.
避免 建和 临时 表,以减少系 源的消耗。  
   
  22.
临时 表并不是不可使用,适当地使用它 可以使某些例程更有效,例如,当需要重复引用大型表或 常用表中的某个数据集 。但是, 于一次性事件,最好使用 出表。  
   
  23.
在新建 临时 ,如果一次性插入数据量很大,那么可以使用   select   into   代替   create   table ,避免造成大量   log   ,以提高速度;如果数据量不大, 和系 表的 源, create   table ,然后 insert  
   
  24.
如果使用到了 临时 表,在存 储过 程的最后 必将所有的 临时 除,先   truncate   table   ,然后   drop   table   这样 可以避免系 表的 较长时间锁 定。  
   
  25.
尽量避免使用游 ,因 的效率 差,如果游 操作的数据超 1 万行,那么就 应该 改写。  
   
  26.
使用基于游 的方法或 临时 表方法之前, 找基于集的解决方案来解决 问题 ,基于集的方法通常更有效。  
   
    27.
临时 表一 ,游 并不是不可使用。 小型数据集使用   FAST_FORWARD   通常要 于其他逐行 理方法,尤其是在必 引用几个表才能 得所需的数据 。在 果集中包括 的例程通常要比使用游 标执 行的速度快。如果开 发时 ,基于游 的方法和基于集的方法都可以 尝试 一下,看哪一种方法 的效果更好。  
   
 
28. 在所有的存 储过 程和触 器的开始 处设   SET   NOCOUNT   ON   ,在 时设   SET   NOCOUNT   OFF   。无需在 行存 储过 程和触 器的每个 句后向客   DONE_IN_PROC   消息。  
   
  29.
尽量避免大事 操作,提高系 能力。  
   
 
30. 尽量避免向客 端返回 大数据量,若数据量 大, 应该 需求是否合理。  
   
 
具体的 SQL 句在很多情况下需要 实际 用情况来写, 里不作叙述

转载于:https://www.cnblogs.com/yjhong2001/archive/2009/09/05/1560946.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值