WHERE子句中的IS NULL导致查询运行缓慢

时间:2014-10-30 17:38:34

标签: sql sql-server

我的查询在Where子句中没有is null参数的情况下运行得很快,但是当我将其添加回来时,运行时间超过10分钟。

SELECT
    Parent_FRID, Name, lvl2desc, capyr, crpprjamt, empprjamt,
    othprjamt AS Other_Projected, Fcrprepamt, Femprepamt, Fothrepamt, NFcrprepamt,
    NFemprepamt, NFothrepamt, crpamt, empamt, othamt, Audited, Previous_Corp_Amt,
    Previous_Emp_Amt, Previous_Total_Projected, Previous_Total_Reported,
    Previous_Audited, crpfnl, empfnl, othfnl
FROM
    Camp_Sum_6_Current_14
WHERE
    cnttyp IS NULL AND
    lvl2 <> '1020' AND
    doncls in ('AG','CO')

我已经尝试了一切,但我无法弄明白。我尝试了一个子查询。我尝试将Null值更改为&#39; None&#39;在原始表中。相同的查询运行正常,不是null。

5 个答案:

答案 0 :(得分:0)

如果在doncls上放置索引,这将允许SQL-Server非常快速地过滤"AG""AC"。然后其他条件将在非常简化的行集上运行。 (假设只有一小部分行具有“AG”或“AC”。)

lvl2上的索引不会有太大帮助,因为此列中的条件被公式化为排除。

根据cnttyp中有多少NULL,索引也可以帮助那些。

如果使用它们的条件非常有选择性,则索引仅有帮助。即if和index有助于排除95%的行,这很有用。如果它只排除50%的行,则表扫描或索引扫描可能会更快。

答案 1 :(得分:0)

尝试子查询

选择

Parent_FRID, Name, lvl2desc, capyr, crpprjamt, empprjamt,
othprjamt AS Other_Projected, Fcrprepamt, Femprepamt, Fothrepamt, NFcrprepamt,
NFemprepamt, NFothrepamt, crpamt, empamt, othamt, Audited, Previous_Corp_Amt,
Previous_Emp_Amt, Previous_Total_Projected, Previous_Total_Reported,
Previous_Audited, crpfnl, empfnl, othfnl

来自

Camp_Sum_6_Current_14

WHERE

lvl2 <> '1020' AND
doncls in ('AG','CO') AND
Parent_FRID in

(SELECT     Parent_FRID 从     Camp_Sum_6_Current_14 哪里     cnttyp IS NULL)

答案 2 :(得分:0)

尝试使用cte

with xyz as (SELECT
    Parent_FRID, Name, lvl2desc, capyr, crpprjamt, empprjamt,
    othprjamt AS Other_Projected, Fcrprepamt, Femprepamt, Fothrepamt, NFcrprepamt,
    NFemprepamt, NFothrepamt, crpamt, empamt, othamt, Audited, Previous_Corp_Amt,
    Previous_Emp_Amt, Previous_Total_Projected, Previous_Total_Reported,
    Previous_Audited, crpfnl, empfnl, othfnl FROM
    Camp_Sum_6_Current_14)

select *  from xyz WHERE
    cnttyp IS NULL AND
    lvl2 <> '1020' AND
    doncls in ('AG','CO')

答案 3 :(得分:-1)

您是否尝试在= NULL子句中使用IS NULL代替WHERE
这对我很有帮助,但我还没弄明白原因......
例如,我的查询看起来像这样: 在一些选择计数和内连接语句之后

WHERE l02_bnr LIKE @bnr +''
AND ((@Status IS NULL) OR l02_status = @Status)

我将((@Status IS NULL)更改为(@Status = NULL),从20秒变为5秒演出。

答案 4 :(得分:-2)

WITH DATA AS 
(
SELECT
    Parent_FRID, Name, lvl2desc, capyr, crpprjamt, empprjamt,
    othprjamt AS Other_Projected, Fcrprepamt, Femprepamt, Fothrepamt, NFcrprepamt,
    NFemprepamt, NFothrepamt, crpamt, empamt, othamt, Audited, Previous_Corp_Amt,
    Previous_Emp_Amt, Previous_Total_Projected, Previous_Total_Reported,
    Previous_Audited, crpfnl, empfnl, othfnl, ISNULL(cnttyp,0) AS NULLCHECK
FROM
    Camp_Sum_6_Current_14
WHERE
        lvl2 <> '1020' AND
    doncls in ('AG','CO')
)
SELECT * FROM DATA
WHERE NULLCHECK = 0
相关问题