【发布时间】:2020-02-27 00:54:28
【问题描述】:
有两个相同的表。动态参数将确定从两个表中的哪一个获取数据。我采用的方法是合并两个表的结果,并为每个子查询添加一个谓词以过滤传入的参数(请参见下文)。这产生了一个估计的执行计划,该计划读取两个表,然后应用过滤器。有没有办法在不使用条件(如 IF)的情况下优化查询,以便只查询适当的表?
create table Flip (ID uniqueidentifier)
create table Flop (ID uniqueidentifier)
查询
declare @useFlip bit
select * from Flip where @useFlip=1
union
select * from Flop where @useFlip<>1
执行计划
【问题讨论】:
-
顺便说一句,
union all而不是union大概可以删除 63% 的排序步骤 -
从答案中的 cmets 看来,我们这里没有完整的图片(因为您现在告诉我您正在使用 iTVF,您没有在上面详细说明) .似乎我们需要被告知您要解决的真正问题,否则如果使用
UNION ALL无济于事,这可能是一个 XY 问题。 -
如果函数是内联的并且结果查询具有
recompile查询提示,那么查询优化器应该做正确的事℠。不幸的是,iTVF 无法强制使用查询重新编译。
标签: tsql query-optimization sql-server-2014