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

标签 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')

我已经尝试了一切,但还是无法弄清楚。我尝试了子查询。我尝试将原始表中的空值更改为“无”。当 is not null 时,相同的查询运行良好。

最佳答案

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

lvl2 上的索引不会有太大帮助,因为该列上的条件被制定为排除。

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

索引只有在使用索引的条件非常有选择性的情况下才有帮助。 IE。如果索引有助于排除 95% 的行,那么它很有用。如果仅排除 50% 的行,表扫描或索引扫描可能会更快。

关于sql - WHERE 子句中的 IS NULL 导致查询运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26659767/

相关文章:

mysql - 列中项目之间的差异

mysql - 是否有一个数据库工具可以显示我有权执行的 sql 命令列表?

SQL Server xp_delete_file 不删除文件

mysql - CodeIgniter 从两个以上的表中获取记录

mysql - 如果表具有相同的数据,mysql 中的排序顺序是什么?

sql-server - 如何从数据库中获取用户定义变量的值?

sql-server - SQL Server,将命名实例转换为默认实例?

c# - 如果用户尚未查看帖子,则显示粗体文本

sql - 如何从另一台服务器访问我的数据库

mysql不同类型的公用表