我的查询在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。
答案 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