【问题标题】:SQL Server optimized large query with ISNULL where clauseSQL Server 使用 ISNULL where 子句优化大型查询
【发布时间】:2016-11-10 19:41:02
【问题描述】:

我有以下大型选择查询,它在 08:15 返回 150 万行。我需要优化选择大约 290 列的查询,我不能减少列数来提高速度。

select Column1 ... Column290
from dob.table1
where (ISNULL(Column50, 1) = 1)

我读到ISNULL 如果在WHERE 子句中使用会降低性能,因为优化器不使用索引而是诉诸扫描,对吗?

我正在研究如何重写

WHERE (ISNULL(Column50, 1) = 1)

我尝试使用 with cte 并设置

IP_Column50 = case when IP_Column50 is null then else IP_Column50 end

并将我的查询重写为

select * 
from cte 
where IP_Column50 = 1

但 CTE 需要更长的时间。

我读到了这种方法

如果是这样,请考虑使用 if isnull(col1, 0) 的结果创建一个计算列并将计算列索引并在 where 子句中使用它

但我不确定如何实现这一点。对优化此查询的任何帮助表示赞赏。

谢谢

【问题讨论】:

  • Column50的数据类型是什么?

标签: sql sql-server tsql


【解决方案1】:

您也可以在单个查询中执行此操作。像这样。

select Column1 ... Column290
from dob.table1
where Column50 = 1
OR Column50 IS NULL

这有可能成为问题,因为这是一种捕获所有查询的类型。如果您有多个条件需要像这样检查,请查看这篇文章。

http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

【讨论】:

  • 最佳答案和双倍时间的全面教育
【解决方案2】:

使用联合

select Column1 ... Column290 from dob.table1 where Column50 is null
union
select Column1 ... Column290 from dob.table1 where Column50 = 1

【讨论】:

    【解决方案3】:

    你可以这样做

    select Column1 ... Column290
    from dob.table1
    where Column50 IS NULL OR (Column50 IS NOT NULL AND Column50 = 1)
    

    正如你所说和here 所示,在 Where 子句中使用 ISNULL 似乎比使用 IS NULL 效率低。

    【讨论】:

    • 为什么要检查括号内的 = 1 AND NOT NULL ?根据定义,如果值为 1,则它不可能为 NULL。 :)
    • @SeanLange 我想你在这种情况下是对的,但我现在无法测试它=/这只是我在比较任何空值时的一个旧习惯以避免any problems with relational comparison involving said nulls
    • @SeanLange 你说的对。刚刚测试,确实没有必要同时检查 IS NULL 和 IS NOT NULL。感谢您的来电。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多