Stored procedures 使用条件变量会否定执行计划的保留和重用吗

Stored procedures 使用条件变量会否定执行计划的保留和重用吗,stored-procedures,sql-server-2008-r2,Stored Procedures,Sql Server 2008 R2,我想在SQLServer中编写一个使用“条件变量”的存储过程。根据条件,我指的是以下几点: CREATE PROCEDURE [dbo].[Order_SEL] @BeginDate DATETIME = NULL , @ENDDATE = NULL = NULL BEGIN SELECT ID , CustomerID , DateOrdered FROM Orders WHERE

我想在SQLServer中编写一个使用“条件变量”的存储过程。根据条件,我指的是以下几点:

CREATE PROCEDURE [dbo].[Order_SEL]
    @BeginDate DATETIME = NULL
    , @ENDDATE = NULL = NULL

BEGIN
    SELECT
        ID
        , CustomerID
        , DateOrdered
    FROM
        Orders
    WHERE
        (
        @BeginDate IS NULL
        OR
        DateOrdered BETWEEN @BeginDate AND @EndDate
        )
END

现在,我知道使用存储过程的好处之一是执行计划保留和重用。上述使用的方法会否定这一优势吗?

这将取决于程序第一次执行时编译的计划,以及当时的参数是否(a)代表表中的大量或少量行,以及(b)代表大部分时间提供的参数值。请执行“参数嗅探”的web搜索并从开始。由于SQL Server现在可以在语句级别进行编译,因此,(a)使用
IF
逻辑和独立查询进行分支,或者(b)使用动态SQL有条件地构建查询是有意义的。@AaronBertrand:当然!为什么现在我希望任何SQL问题都有一个简单的是/否答案。因此,基本上你是说:这取决于:)没错,我认为通常这是一种不安全/不可靠的方法,但最终这可能并不重要,这取决于你的查询模式、数据大小等。你应该使用你的数据、硬件、查询模式进行测试,等等,看看您是否注意到计划中的差异,这取决于各种各样的参数值、查询是否有覆盖索引等,并确保在释放过程缓存(或至少收回这些特定计划)后测试各种各样的参数。推荐用于测试系统,但不推荐用于生产。@AaronBertrand:我的实际用例是提供一个存储过程来支持用户定义的搜索。用户最多可以包括四个或五个条件来定义其搜索。显然(我认为)为每一个可能的组合创造一个大爆发是不可行的。因此,我可能只需要接受任何可能的性能影响,而不是制造维护噩梦。我的假设正确吗?请阅读Erland的文章。