Sql server sql server,大过程性能

Sql server sql server,大过程性能,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个存储过程,有1k行和16个不嵌套的if子句。每个if在一组4个变量上工作,如: if @a is null and @b is null and @c is null and @d is null if @a is null and @b is null and @c is null and @d is not null 依此类推(因此4^2=16)。我这样写程序: 首先,因为它比嵌套的ifs更可读(在这个过程中有很多工作要做)。 第二,因为每个if块都得到了一个非常简单的代码和平(在

我有一个存储过程,有1k行和16个不嵌套的if子句。每个if在一组4个变量上工作,如:

if @a is null and @b is null and @c is null and @d is null
if @a is null and @b is null and @c is null and @d is not null
依此类推(因此4^2=16)。我这样写程序:

首先,因为它比嵌套的ifs更可读(在这个过程中有很多工作要做)。 第二,因为每个if块都得到了一个非常简单的代码和平(在主键上选择,或在3或4个主键上选择并集)。 第三,变量@a的存在意味着一个union all,变量@b的存在意味着一个连接和一个距离计算,@c的存在意味着一个连接,@d的存在意味着另一个连接。比如:

现在我一直在想性能,我不知道如何编写程序来获得最佳性能。有什么提示吗?

您需要阅读以下内容:有许多技术支持使用大量可选筛选参数的查询。诀窍在于选择正确的策略,而做一千个“如果”并不是最好的

如果您有正确的SQL Server 2008版本(SQL 2008 SP1 CU5(10.0.2746)及更高版本),您可以使用以下小技巧实际使用索引:在查询中添加
选项(重新编译)
,SQL Server将从
中解析
(@OptionalParameter为NULL或YourColumn=@OptionalParameter)
根据本地变量的运行时值创建查询计划之前,可以使用索引

这将适用于任何SQL Server版本(返回正确的结果),但仅在使用SQL 2008 SP1 CU5(10.0.2746)及更高版本时才包括(重新编译)选项。选项(重新编译)将重新编译您的查询,只有列出的verison将根据局部变量的当前运行时值重新编译查询,这将为您提供最佳性能。如果不是在该版本的SQLServer2008上,请将该行保留。请记住,
可以终止索引使用,但在正确的SQL Server 2008版本上,
选项(重新编译)
将使用索引

--sample procedure that uses optional search parameters
CREATE PROCEDURE YourProcedure
    @FirstName varchar(25) = null,
    @LastName varchar(25) = null,
    @Title varchar(25) = null
AS
    BEGIN
        SELECT ID, FirstName, LastName, Title
        FROM tblUsers
        WHERE
            (@FirstName IS NULL OR (FirstName = @FirstName))
            AND (@LastNameIS NULL OR (LastName= @LastName))
            AND (@TitleIS NULL OR (Title= @Title))
        OPTION (RECOMPILE) ---<<<<use if on for SQL 2008 SP1 CU5 (10.0.2746) and later
    END
——使用可选搜索参数的示例过程
创建过程您的过程
@FirstName varchar(25)=空,
@LastName varchar(25)=空,
@Title varchar(25)=空
作为
开始
选择ID、FirstName、LastName、Title
来自特布卢斯
哪里
(@FirstName为NULL或(FirstName=@FirstName))
和(@LastName为NULL或(LastName=@LastName))
和(@TitleIS NULL或(Title=@Title))
选项(重新编译)--您需要阅读以下内容:有许多技术支持使用大量可选筛选参数的查询。诀窍在于选择正确的策略,而做一千个“如果”并不是最好的

如果您有正确的SQL Server 2008版本(SQL 2008 SP1 CU5(10.0.2746)及更高版本),您可以使用以下小技巧实际使用索引:在查询中添加
选项(重新编译)
,SQL Server将从
中解析
(@OptionalParameter为NULL或YourColumn=@OptionalParameter)
根据本地变量的运行时值创建查询计划之前,可以使用索引

这将适用于任何SQL Server版本(返回正确的结果),但仅在使用SQL 2008 SP1 CU5(10.0.2746)及更高版本时才包括(重新编译)选项。选项(重新编译)将重新编译您的查询,只有列出的verison将根据局部变量的当前运行时值重新编译查询,这将为您提供最佳性能。如果不是在该版本的SQLServer2008上,请将该行保留。请记住,
可以终止索引使用,但在正确的SQL Server 2008版本上,
选项(重新编译)
将使用索引

--sample procedure that uses optional search parameters
CREATE PROCEDURE YourProcedure
    @FirstName varchar(25) = null,
    @LastName varchar(25) = null,
    @Title varchar(25) = null
AS
    BEGIN
        SELECT ID, FirstName, LastName, Title
        FROM tblUsers
        WHERE
            (@FirstName IS NULL OR (FirstName = @FirstName))
            AND (@LastNameIS NULL OR (LastName= @LastName))
            AND (@TitleIS NULL OR (Title= @Title))
        OPTION (RECOMPILE) ---<<<<use if on for SQL 2008 SP1 CU5 (10.0.2746) and later
    END
——使用可选搜索参数的示例过程
创建过程您的过程
@FirstName varchar(25)=空,
@LastName varchar(25)=空,
@Title varchar(25)=空
作为
开始
选择ID、FirstName、LastName、Title
来自特布卢斯
哪里
(@FirstName为NULL或(FirstName=@FirstName))
和(@LastName为NULL或(LastName=@LastName))
和(@TitleIS NULL或(Title=@Title))

选项(重新编译)--显示更多的过程。你说的是动态搜索条件吗?如果是这样的话,为每种情况都提供一个声明将在牺牲可维护性的情况下为您提供最佳性能。请参见我的编辑,第一种情况0 0 1表示连接功能,第二种情况0 1 0表示连接类别,等等(当然还有更复杂的情况1).ps:我习惯于在第一段代码中进行完整路径连接,之后我只删除开销步骤,所以不用担心类别或城市之间的连接(我只需要检查一下类别和地址)。显示更多过程。你说的是动态搜索条件吗?如果是这样的话,为每种情况都提供一个声明将在牺牲可维护性的情况下为您提供最佳性能。请参见我的编辑,第一种情况0 0 1表示连接功能,第二种情况0 1 0表示连接类别,等等(当然还有更复杂的情况1).ps:我习惯在第一段代码中进行完整路径连接,之后我只删除开销步骤,所以不用担心类别或城市之间的连接(我只需要检查一下类别和地址)。是的,我会检查一下。但我明白了。首先,我认为将所有if更改为else if将阻止检查所有if,其次,我可以根据使用情况重新保存ifs的顺序。第三,添加此选项。谢谢,10.50.1600.1。标准版(64位)。我想它会起作用的。是的,我会检查一下。但我明白了。首先,我认为将所有if更改为else if将阻止检查所有if,其次,我可以根据使用情况重新保存ifs的顺序。第三,添加此选项。谢谢,10.50.1600.1。