多次调用昂贵的查询与使用游标

时间:2017-12-18 10:08:33

标签: sql-server tsql query-optimization

给定一个大型列表作为昂贵查询(表值函数)的输入参数,我想对这些函数调用的每个结果集执行几个测试。

我想知道,因为我试图避免在不需要时使用游标,如果查询优化器每次在查询中添加另一个CASE WHEN时调用Table Valued函数,或者它是否缓存结果在以下示例查询中。

select Case
   when not exists (select * from expensive_tvf(list.parametervalue)) then 'does not exist'
   when list.x <> (select top 1 name from expensive_tvf(list.parametervalue)  order by order asc) then 'x does not match'
   when list.x not in (select name from expensive_tvf(list.parametervalue) then 'x is not contained'
 END as "TestMsg"
FROM InputTable list

换句话说:对于这种模式使用Cursor是否更好?或者这仍然可以在一个查询中以有效的方式完成吗?

编辑:正如@Larnu提到的(Thx btw,upvote),我重新设计了查询以使用OUTER APPLY(我也想测试,如果tvf没有返回任何内容)......

select case
   when list.x <> FIRST_VALUE(tvf.name) OVER (PARTITION BY list.parametervalue ORDER by tvf.order asc) THEN 'x does not match'
   when list.y <> LAST_VALUE(tvf.name) OVER (PARTITION BY list.parametervalue ORDER by tvf.order asc) THEN 'y does not match'
   when tvf.name IS NULL THEN 'function did not return values'
END as "TestMsg"
FROM InputTable list
OUTER APPLY (select name,order from expensive_tvf(list.parametervalue)) tvf

这似乎有效但我不太确定这是否真的更有效,因为查询运行时仍然很长并且我担心该函数每个输入行只运行一次但是两次或更多次常。

0 个答案:

没有答案