加入 table 值函数会减慢查询速度

Joining on table-valued function slows down query

Orders 是 350k 行。 Users 是 20k 行。 Reflinks 是 2k 行。 @p0 是 40k 个 ID。 SplitIds(@p0) 拆分 @p0 和 returns TABLE(Id INT NOT NULL PRIMARY KEY)。看起来它立即执行。

第一个 SELECT 立即执行,returns 7.5k 行。它的执行计划完全基于'Hash Match'块。

第二个 SELECT 执行 120 秒和 returns 相同的 7.5k 行。它的执行平面相同,但基于 Nested Loop 个块。

是否有可能以某种方式加快第二个查询的速度?我的任务是明确指定输入订单列表,这就是我创建 SplitIds 的原因。如果你知道如何在没有 SplitIds 的情况下做到这一点 - 你的想法也会受到赞赏。

DECLARE @p0 varbinary(max);
SET @p0 = 0x.........; // LOT OF BYTES 

SELECT Orders.Id, Reflinks.Rate1
FROM Orders
INNER JOIN Users ON Orders.UserId = Users.Id
INNER JOIN Reflinks ON Users.ReflinkId = Reflinks.Id

SELECT Orders.Id, Reflinks.Rate1
FROM SplitIds(@p0) AS t0
INNER JOIN Orders ON t0.Id = Orders.Id
INNER JOIN Users ON Orders.UserId = Users.Id
INNER JOIN Reflinks ON Users.ReflinkId = Reflinks.Id

如果您愿意使用临时 table,您可以将 SplitIds 的结果存储在正确索引的临时 table 中,然后使用它执行第二个查询。这肯定会加快速度,因为 SQL 服务器将能够为查询创建更好的执行计划。

CREATE TABLE #temp(Id INT NOT NULL PRIMARY KEY)

INSERT INTO #temp(Id) SELECT Id FROM SplitIds(@p0)

SELECT Orders.Id, Reflinks.Rate1
FROM #temp AS t0
INNER JOIN Orders ON t0.Id = Orders.Id
INNER JOIN Users ON Orders.UserId = Users.Id
INNER JOIN Reflinks ON Users.ReflinkId = Reflinks.Id