连接功能比连接临时表和功能数据需要更长的时间

时间:2014-03-31 04:12:55

标签: sql sql-server performance function join

所以我在我的函数中有这个场景,其中FooIds(仅包含id的函数)在连接时需要一段时间而不是在临时表中插入:

SELECT TOP 5000 foo1.a, foo2.b, foo1.c
FROM fooA foo1 WITH (NOLOCK)
INNER JOIN fooB foo2 WITH (NOLOCK) ON (foo1.someId1 = foo2.someId1)
INNER JOIN fooIds(@user_id) i ON (i.id = foo1.someId2)
WHERE foo1.someStuff > @userInput
ORDER BY foo1.someId1 ASC
OPTION (RECOMPILE)
RETURN

这需要一个多小时!! 但是,以下代码需要2秒钟:

DECLARE @ids TABLE (id int);    
INSERT INTO @ids
SELECT * FROM [FooIds](@user_id)

SELECT TOP 5000 foo1.a, foo2.b, foo1.c
FROM fooA foo1 WITH (NOLOCK)
INNER JOIN fooB foo2 WITH (NOLOCK) ON (foo1.someId1 = foo2.someId1)
INNER JOIN @ids i ON (i.id = foo1.someId2)
WHERE foo1.someStuff > @userInput
ORDER BY foo1.someId1 ASC
OPTION (RECOMPILE)
RETURN

我不想创建额外声明的表,但是这个hack似乎比上一个查询更快。几千个记录中包含 Foo1 ,而 FooIds 包含数千个记录。

1 个答案:

答案 0 :(得分:1)

作为一般规则,避免在性能危急情况下使用多语句表函数(以及带数据访问的标量函数)。请尝试在外部查询中内联代码。