存储过程效率 - 空输入参数和Where子句

Rob*_*Rob 1 t-sql sql-server performance stored-procedures

我喜欢通过将一堆输入参数全部默认为NULL然后使用Equality或NULL测试包含在WHERE中的相同参数来最小化我所拥有的存储过程的数量.

这与查询性能有多低效 - 为1个特定任务编写存储过程?例如,仅按UserId选择,按用户名/密码选择,按FirstName/LastName选择...

例:

CREATE PROC dbo.up_Select_User

  @UserId int = NULL
, @Username varchar(255) = NULL
, @Password varchar(255) = NULL
, @FirstName varchar(50) = NULL
, @LastName varchar(50) = NULL
, @IsActive bit = NULL


SELECT UserId, Username, FirstName, LastName, EmailAddress
FROM dbo.[User]
WHERE (UserId = @UserId OR @UserId IS NULL)
AND (Username = @Username OR @Username IS NULL)
AND (Password = @Password OR @Password IS NULL)
AND (FirstName = @FirstName OR @FirstName IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (IsActive = @IsActive OR @IsActive IS NULL)
Run Code Online (Sandbox Code Playgroud)

一些额外的信息 - 可能不相关......我使用实体框架4使用混合的普通实体和复杂类型映射到存储过程,具体取决于查询结果.

gbn*_*gbn 7

这是低效的,因为它使用OR并且优化器将默认为扫描.

如果你有几千行,那就没问题了.

有时,这种模式效果更好,因为ISNULL可以变得微不足道

SELECT UserId, Username, FirstName, LastName, EmailAddress
FROM dbo.[User]
WHERE
    UserId = ISNULL(@UserId, UserId) AND
    Username = ISNULL(@Username , Username) AND 
    Password = ISNULL(@Password , Password ) ...
Run Code Online (Sandbox Code Playgroud)