遇到让我很头疼的问题...表A有字段DATE的非聚集索引...不包括DATE的主键聚集索引
在一个查询中,有如下查询条件:AND A.DATE BETWEEN @DateFrom AND @DateTo使用变量@DateFrom @DateTo 需要2分钟左右...太长了,其中变量的值分别为'2012-01-01','2012-01-02',查看执行计划,这部分使用了聚集索引查找(也是百分比最大的地方)而当我将c查询条件改为 AND A.DATE BETWEEN '2012-01-01' AND '2012-01-02' 的时候,查血结果却在1秒内出来了........也就是说只有将变量改为字符HardCode时才使用了字段DATE的非聚集索引查找....有人可以帮到我吗,谢谢

解决方案 »

  1.   

    应该不是你说的问题。
    我猜测是 A.DATE 和你定义的变量 @DateFrom, @DateTo使用了不同的类型。
    把 @DateFrom和 @DateTo定义成和 A.DATE 都相同的类型试试。
      

  2.   

    可能是使用变量SQL SERVER 统计信息不准造成的,能看一下两者的执行计划吗
      

  3.   

    常量 + 精确查找
    常量 + 范围查找
    变量 + 精确查找
    变量 + 范围查找
    上面几种情况中,你这种是最糟糕的,这种情况多半使用不了索引,由于在编译阶段无法得到变量的值,因此无法制定有效的执行计划,大多数情况下会变成表扫描,实在不行的话搞成动态sql吧
      

  4.   

    没遇到过类似问题。
    lz可以试试动态SQL
    exec('select....')
    还有强制索引(with(index(索引Name)))不知道行不行。。个人感觉够呛...