Sql server 2008 连接表值函数会减慢查询速度

Sql server 2008 连接表值函数会减慢查询速度,sql-server-2008,sql-execution-plan,Sql Server 2008,Sql Execution Plan,订单为350k行用户为20k行重新链接为2k行@p0是40k ID拆分Id(@p0)拆分@p0并返回表(Id INT非空主键)。看起来它会立即执行 第一个SELECT立即执行并返回7.5k行。它的执行计划完全基于“哈希匹配”块 第二个SELECT执行120s并返回相同的7.5k行。其执行平面相同,但基于嵌套循环块 是否有可能以某种方式加快第二个查询?我的任务是显式指定输入顺序列表,这就是我创建splitid的原因。如果您知道如何在没有SplitIds的情况下完成此操作,您的想法也将受到赞赏 DE

订单
为350k行<代码>用户为20k行<代码>重新链接为2k行<代码>@p0是40k ID<代码>拆分Id(@p0)拆分
@p0
并返回
表(Id INT非空主键)
。看起来它会立即执行

第一个
SELECT
立即执行并返回7.5k行。它的执行计划完全基于“哈希匹配”块

第二个
SELECT
执行120s并返回相同的7.5k行。其执行平面相同,但基于
嵌套循环

是否有可能以某种方式加快第二个查询?我的任务是显式指定输入顺序列表,这就是我创建
splitid
的原因。如果您知道如何在没有
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

如果您愿意使用临时表,则可以将来自
SplitIds
的结果存储在正确索引的临时表中,并使用它执行第二次查询。这肯定会加快速度,因为SQLServer将能够为查询创建更好的执行计划

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

同意@Guillermo Gutiérrez,并建议尝试使用表变量,如带有唯一约束的“@table”,该约束创建非聚集索引。甚至,您也可以尝试使用上面提到的#表的非聚集索引。先生,我尝试了您的版本。它确实有效。执行计划与我的第一个版本相同。但最重要的是,它让我认识到真正的瓶颈是
SplitIds
本身。