我有以下大型选择查询,它在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子句中使用它
但我不知道如何实现这一点。优化此查询可以获得任何帮助。
由于
答案 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的效率。