Sql 连接函数所用的时间比连接带有函数数据的临时表所用的时间长

Sql 连接函数所用的时间比连接带有函数数据的临时表所用的时间长,sql,sql-server,performance,function,join,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) WH

因此,在我的函数中有这样一个场景,,其中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

我不想创建额外声明的表,但是这种攻击似乎比前面的查询更快Foo1包含超过数十亿条记录,而FOOID包含数千条记录。

一般来说,在性能关键的情况下,避免使用多语句表函数(以及具有数据访问功能的标量函数)。尝试将代码内联到外部查询中。

但不能在函数中使用临时表,对吗?当然-我建议完全删除函数,不是吗?嗯,修改答案。。不管怎样,我刚刚读到了内联函数和多语句函数的比较,我将试一试。。!谢谢我会标记你的答案,如果它工作得很好,它似乎比黑客多语句功能更快!谢谢!