Tsql 如何优化从两个表中的一个或另一个表获取的T-SQL查询

Tsql 如何优化从两个表中的一个或另一个表获取的T-SQL查询,tsql,query-optimization,sql-server-2014,Tsql,Query Optimization,Sql Server 2014,有两张完全相同的桌子。动态参数将决定从两个表中的哪一个获取数据。我采用的方法是合并两个表的结果,并向每个子查询添加一个谓词,以过滤传入的参数,请参见下文。这产生了一个估计的执行计划,该计划读取两个表,然后应用过滤器。有没有一种方法可以在不使用IF这样的条件的情况下优化查询,从而只查询适当的表 create table Flip (ID uniqueidentifier) create table Flop (ID uniqueidentifier) 询问 declare @useFlip bi

有两张完全相同的桌子。动态参数将决定从两个表中的哪一个获取数据。我采用的方法是合并两个表的结果,并向每个子查询添加一个谓词,以过滤传入的参数,请参见下文。这产生了一个估计的执行计划,该计划读取两个表,然后应用过滤器。有没有一种方法可以在不使用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
执行计划


我个人会转向一个动态的陈述,或者如果…或者逻辑。因为您只需要查询一个表,所以创建一个相关的计划更有意义

动态方法:

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT * FROM ' + QUOTENAME(CASE @UseFlip WHEN 1 THEN N'Flip' ELSE N'Flop' END) + N';';
EXEC sp_executesql @SQL;
如果……否则方法:

IF @UseFlip = 1
    SELECT * FROM Flip;
ELSE
    SELECT * FROM Flop;

编辑:上述内容已完全无效,因为OP在下面对该答案进行了评论,以告知他们正在使用内联表值函数。该信息目前不在问题范围内。这两种说法都不能在iTVF中使用。

顺便说一句,union all而不是union可能会从答案的注释中删除63%的排序步骤,似乎我们这里没有完整的图片,因为您现在告诉我您正在使用iTVF,您在上面没有详细说明。似乎需要告诉我们您试图解决的真正问题,否则如果使用UNION ALL没有帮助,这可能是一个XY问题。如果函数是内联的,并且结果查询具有重新编译查询提示,那么查询优化器应该做正确的事情℠. 不幸的是,iTVF无法强制消费查询重新编译。嗯,我试图避免使用IF…ELSE,因为我喜欢将查询作为内联表值函数的一部分。为什么您不在问题@Sumith中提到这一点?这完全否定了我的答案……它就在问题中。我说过我想避免像IF这样的条件。我不想使用IF,也不想转换为我使用的是iTVF,因此所有内容都必须在一条语句中@Sumith但我不想用IF…ELSE。此外,当我第一次键入问题时,它有create函数定义,而且似乎是一个大问题。所以我把它缩小到了特定的位置。现在,关于这个主题,有没有一种不同的方式来表达查询的语义,这样两个表都不会被扫描?或者有没有一种方法可以教育SQL在@useFilp=1时使用一个计划,在@useFlip=0时使用另一个计划?