关闭

SQL点滴之性能优化其实没有那么神秘(下)

发表于:2011-8-10 10:25

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  7、尽量使用索引

  建立索引后,并不是每个查询都会使用索引,在使用索引的情况下,索引的使用效率也会有很大的差别。只要我们在查询语句中没有强制指定索引,索引的选择和使用方法是SQLSERVER的优化器自动作的选择,而它选择的根据是查询语句的条件以及相关表的统计信息,这就要求我们在写SQL语句的时候尽量使得优化器可以使用索引。

  为了使得优化器能高效使用索引,写语句的时候应该注意:

  A、不要对索引字段进行运算,而要想办法做变换,比如

  • SELECT ID FROM T WHERE NUM/2=100 
  • 应改为: 
  • SELECT ID FROM T WHERE NUM=100*2 
  • SELECT ID FROM T WHERE NUM/2=NUM1 
  • 如果NUM有索引应改为: 
  • SELECT ID FROM T WHERE NUM=NUM1*2 
  • 如果NUM1有索引则不应该改。 
  • 发现过这样的语句: 
  • SELECT 年,月,金额 FROM 结余表 
  • WHERE 100*年+月=2007*100+10 
  • 应该改为: 
  • SELECT 年,月,金额 FROM 结余表 
  • WHERE 年=2007 AND 
  •       月=10
  •   B、不要对索引字段进行格式转换

      日期字段的例子:

  • WHERE CONVERT(VARCHAR(10), 日期字段,120)=’2008-08-15’ 
  • 应该改为 
  • WHERE日期字段〉=’2008-08-15’ AND 日期字段<’2008-08-16’ 
  • ISNULL转换的例子: 
  • WHERE ISNULL(字段,’’)<>’’应改为:WHERE字段<>’’ 
  • WHERE ISNULL(字段,’’)=’’不应修改 
  • WHERE ISNULL(字段,’F’) =’T’应改为: WHERE字段=’T’ 
  • WHERE ISNULL(字段,’F’)<>’T’不应修改
  •   C、不要对索引字段使用函数

  • WHERE LEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC' 
  • 应改为: 
  • WHERE NAME LIKE 'ABC%'
  •   日期查询的例子:

  • WHERE DATEDIFF(DAY, 日期,'2005-11-30')=0应改为:WHERE 日期 >='2005-11-30' AND 日期 <'2005-12-1‘ 
  • WHERE DATEDIFF(DAY, 日期,'2005-11-30')>0应改为:WHERE 日期 <'2005-11-30‘ 
  • WHERE DATEDIFF(DAY, 日期,'2005-11-30')>=0应改为:WHERE 日期 <'2005-12-01‘ 
  • WHERE DATEDIFF(DAY, 日期,'2005-11-30')<0应改为:WHERE 日期>='2005-12-01‘ 
  • WHERE DATEDIFF(DAY, 日期,'2005-11-30')<=0应改为:WHERE 日期>='2005-11-30‘
  • 42/4<1234>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号