所以我在我的函数中有这个场景,其中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 包含数千个记录。
答案 0 :(得分:1)
作为一般规则,避免在性能危急情况下使用多语句表函数(以及带数据访问的标量函数)。请尝试在外部查询中内联代码。