我有一个连接一些表的查询,当我在这样的 where 子句中使用=
运算符而不是in
运算符时,我得到了显着的性能改进。
=
操作员花费不到一秒钟的时间。in
操作员大约需要一分钟。
where P.GID in ( SELECT GID from [dbo].[fn_SomeFunction] (15268) )
子查询在大多数情况下返回 1 个结果,仅此更改将改善大多数情况,但会导致其他一些情况出现错误。
有什么想法为什么会出现这种行为?
我有一个连接一些表的查询,当我在这样的 where 子句中使用=
运算符而不是in
运算符时,我得到了显着的性能改进。
=
操作员花费不到一秒钟的时间。in
操作员大约需要一分钟。where P.GID in ( SELECT GID from [dbo].[fn_SomeFunction] (15268) )
子查询在大多数情况下返回 1 个结果,仅此更改将改善大多数情况,但会导致其他一些情况出现错误。
有什么想法为什么会出现这种行为?
尝试类似的东西,它未经测试,可能包含一些语法错误。主要思想是在临时表变量中获取所需的 id 并在连接中使用它。希望有帮助。
DECLARE @gids TABLE(
GID UNIQUEIDENTIFIER NOT NULL
)
INSERT INTO @gids (GID)
SELECT
GID
FROM [dbo].[fn_SomeFunction](15268)
SELECT * FROM SomeTable st INNER JOIN st.GID = @gids.GID
如果这真的代表了一个功能,那就是杀死你的执行时间。您可以通过查看执行计划来验证这一点。发生的情况是,在您的子查询中,必须一遍又一遍地计算该函数。如果您可以删除该功能并用查询替换,您应该会注意到改进。
此外,如果函数返回类型与列的类型不匹配,则需要对每个返回项进行隐式转换。更改函数返回类型(或列类型)以匹配也有助于提高性能。
例如 DateTime <> smalldatetime 并且需要隐式转换。