10

为什么查询版本 2 这么快?

我怀疑数据库引擎多次调用表值函数“GetUsageStatistic”,那么有没有办法告诉引擎“GetUsageStatistic”是确定性的,应该只调用一次?

查询版本 1

--Takes ~10 minutes
select *
from RosterLevel r
left join GetUsageStatistics( @mindate, @maxdate ) usage on r.UserID = usage.UserID;

查询版本 2

--Takes ~10 seconds
select * into #usage from  GetUsageStatistics( @mindate, @maxdate );
select *
from RosterLevel r
left join #usage on r.UserID = #usage.UserID;
4

2 回答 2

1

正如评论中提到的,最好的答案是分析吐出的任何执行计划。除此之外,您的直觉可能是正确的,但除了缓存 SQL Server 自动尝试的任何内容之外,您可以提供的查询提示的方式并没有让我想到太多,以表明该函数是确定性的,但欢迎您尝试查询提示 MSDN 页面中提到了一些事情。我的第一个测试可能会使用Table Hints

于 2011-06-06T20:18:39.820 回答
0

如果您在第一个示例中使用该函数,它会被多次调用——为您的 RosterLevel 表中的每条记录调用一次。它每次返回一个(可能)不同的表,具体取决于连接字段。

如果您在第二个示例中使用该函数,它只会被调用一次。从那里,表变量在内存中,您不必一遍又一遍地读取。

于 2011-06-14T17:28:16.097 回答