IsNull很慢,我有其他选择吗?

时间:2015-07-30 11:15:43

标签: sql sql-server

具有以下查询:

label {
    display: block;
    position:relative;
    text-align: right;
    width: 100px;
    margin: 0 0 5px 0;
}
label > input,
label > select,
input {
    position: absolute;
    left: 120px;
}

此查询需要1秒才能运行,但是当Prop2为空时它会给我错误的SUM

我将查询更改为使用IsNULL

select 
    tA.Name
    ,tA.Prop1
    ,tA.Prop2
    ( select sum(tB.Values)
      from tableB tB
      where tA.Prop1 = tB.Prop1                     
            and tA.Prop2 = tB.Prop2 
    ) as Total
from tableA tA

现在数据正确,但需要大约7秒钟.....

有最快的方法吗?

注意:这只是更复杂查询的部分简化版本....但基本想法就在这里。

2 个答案:

答案 0 :(得分:1)

根据您的描述,=正在使用索引,但isnull()会阻止使用索引。这在SQL服务器中有点难以解决。

一种方法是将逻辑分成两个总和:

select tA.Name, tA.Prop1, tA.Prop2
       (isnull((select sum(tB.Values)
                from tableB tB
                where tA.Prop1 = tB.Prop1 and tA.Prop2 = tB.Prop2 
               ), 0) +
        isnull((select sum(tB.Values)
                from tableB tB
                where tA.Prop1 = tB.Prop1 and
                      tA.Prop2 is null and tB.Prop2 is null
               ), 0)
       ) as Total
from tableA tA;

答案 1 :(得分:1)

我最终使用

AND ( 
           (tA.Prop2= tB.Prop2) 
        OR (tA.Prop2 IS NULL AND tB.Prop2 IS NULL )
     )