我在 SQL Server 2008 R2 中执行了一个过程,脚本是:
DECLARE @LocalVar SMALLINT = GetLocalVarFunction();
SELECT
[TT].[ID],
[TT].[Title]
FROM [TargetTable] AS [TT]
LEFT JOIN [AcceccTable] AS [AT] ON [AT].[AccessID] = [TT].[ID]
WHERE
(
(@LocalVar = 1 AND ([AT].[Access] = 0 OR [AT].[Access] Is Null) AND
([TT].[Level] > 7)
);
GO
此过程在16
几秒钟内执行。但是当我将 Where 子句更改为:
WHERE
(
((1=1) AND [AT].[Access] = 0 OR [AT].[Access] Is Null) AND
([TT].[Level] > 7)
);
该过程在不到1
一秒的时间内执行。
如您所见,我只是删除了局部变量。
那么问题出在哪里?在 where 子句中使用局部变量有什么遗漏吗?当我在 where 子句中使用局部变量时,有什么建议可以提高执行时间?
更新:
我还想if
在脚本之前添加一个语句并将程序拆分为 2 个程序,但是我有 4 或 5 个像上面这样的变量,并且使用if
语句非常复杂。
更新2:
我改变了一组@LocalVar
:
DECLARE @LocalVar SMALLINT = 1;
执行时间没有变化。