技术开发 频道

DBA必备的SQL好习惯 带来一笔大财富

  七:尽量使用索引

  建立索引后,并不是每个查询都会使用索引,在使用索引的情况下,索引的使用效率也会有很大的差别。只要我们在查询语句中没有强制指定索引,

  索引的选择和使用方法是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*年+月=2010*100+10

  应该改为:

  SELECT 年,月,金额 FROM 结余表 WHERE 年=2010 AND月=10

  B、 不要对索引字段进行格式转换

  日期字段的例子:

  WHERE CONVERT(VARCHAR(10), 日期字段,120)='2010-07-15'

  应该改为

  WHERE日期字段〉='2010-07-15' AND 日期字段<'2010-07-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, 日期,'2010-06-30')=0

  应改为:WHERE 日期>='2010-06-30' AND 日期 <'2010-07-01'

  WHERE DATEDIFF(DAY, 日期,'2010-06-30')>0

  应改为:WHERE 日期 <'2010-06-30'

  WHERE DATEDIFF(DAY, 日期,'2010-06-30')>=0

  应改为:WHERE 日期 <'2010-07-01'

  WHERE DATEDIFF(DAY, 日期,'2010-06-30')<0

  应改为:WHERE 日期>='2010-07-01'

  WHERE DATEDIFF(DAY, 日期,'2010-06-30')<=0

  应改为:WHERE 日期>='2010-06-30'

  D、不要对索引字段进行多字段连接

  比如:

  WHERE FAME+ '. '+LNAME='HAIWEI.YANG'

  应改为:

  WHERE FNAME='HAIWEI' AND LNAME='YANG'
0