加入 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
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