【问题标题】:SARGable query where parameter is NULL参数为 NULL 的 SARGable 查询
【发布时间】:2018-02-12 17:21:36
【问题描述】:

我有以下存储过程

CREATE PROCEDURE my_proc
(
   @Person VARCHAR(50)
)
AS
SELECT updatedBy
FROM   MyTable t
WHERE  updatedBy = @Person AND updatedDate > DATEADD(day,-1,GETDATE()) OR
       @CompletedBy IS NULL

最后一行 (OR @CompletedBy IS NULL) 确保如果不传递任何参数,将显示所有记录。但是,查看执行计划,即使在提供参数的情况下,这也会在调用过程时导致聚集索引扫描。

如果我取出 OR,则查询使用索引查找。

有没有一种方法可以让我保持捕获所有行为而不导致索引扫描?

【问题讨论】:

    标签: sql performance sql-server-2016


    【解决方案1】:

    这是存储过程的一个优点。您可以构建两个查询,并使用 If 块来决定运行哪一个。

    或者,您可以将其构建为仅包含您实际需要的 WHERE 子句元素的动态 SQL,然后使用 sp_executesql 运行结果。

    【讨论】:

    • 准确!查询运行得更好!
    猜你喜欢
    • 2019-05-20
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多