SQL Server优化的大型查询与ISNULL where子句

时间:2016-11-10 19:41:03

标签: sql sql-server tsql

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

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

我已经读过ISNULL如果在WHERE子句中使用了性能成本,因为优化器不使用索引而是求助于扫描,是否正确?

我想弄清楚如何重写

WHERE (ISNULL(Column50, 1) = 1)

我尝试使用cte并设置

IP_Column50 = case when IP_Column50 is null then else IP_Column50 end

并将我的查询重写为

select * 
from cte 
where IP_Column50 = 1
但是CTE需要更长时间。

我读到了这种方法

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

但我不知道如何实现这一点。优化此查询可以获得任何帮助。

由于

3 个答案:

答案 0 :(得分:2)

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

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/

答案 1 :(得分:1)

使用UNION

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

答案 2 :(得分:1)

你可以做到

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

正如你所说的那样Purchases.subscriptions,似乎在Where子句中使用ISNULL的效率低​​于使用IS NULL的效率。