0

我有一个连接一些表的查询,当我在这样的 where 子句中使用=运算符而不是in运算符时,我得到了显着的性能改进。

  • =操作员花费不到一秒钟的时间。
  • in操作员大约需要一分钟。

where P.GID in ( SELECT GID from [dbo].[fn_SomeFunction] (15268) )

子查询在大多数情况下返回 1 个结果,仅此更改将改善大多数情况,但会导致其他一些情况出现错误。

有什么想法为什么会出现这种行为?

4

2 回答 2

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
于 2013-10-14T20:37:55.507 回答
0

如果这真的代表了一个功能,那就是杀死你的执行时间。您可以通过查看执行计划来验证这一点。发生的情况是,在您的子查询中,必须一遍又一遍地计算该函数。如果您可以删除该功能并用查询替换,您应该会注意到改进。

此外,如果函数返回类型与列的类型不匹配,则需要对每个返回项进行隐式转换。更改函数返回类型(或列类型)以匹配也有助于提高性能。

例如 DateTime <> smalldatetime 并且需要隐式转换。

于 2013-10-14T20:25:17.680 回答