Sql 查询执行问题

Sql 查询执行问题,sql,sql-server,sql-server-2005,tsql,sql-execution-plan,Sql,Sql Server,Sql Server 2005,Tsql,Sql Execution Plan,在下面的查询中,如果Patients表有1000条记录,TableValueFunction执行了多少次?只有一次还是1000次 这是存储过程中的查询,您有更好的方法来改进它吗 SELECT * FROM Patients WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..)) 这取决于使用什么作为参数。如果参数是常量,则函数将执行一次,但如果参数是患者中的字段,则函数的执行次数将与表患者中的行数

在下面的查询中,如果Patients表有1000条记录,TableValueFunction执行了多少次?只有一次还是1000次

这是存储过程中的查询,您有更好的方法来改进它吗

SELECT * FROM Patients
WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..))

这取决于使用什么作为参数。如果参数是常量,则函数将执行一次,但如果参数是
患者
中的字段,则函数的执行次数将与表
患者
中的行数相同。在某种程度上,这取决于您谈论的是内联TVF还是多语句TVF

多语句TVF对查询优化程序来说是完全不透明的。它总是假设它将返回1行,并且不会扩展到主查询中

由于1行假设,如果您的Patients表在
PatientId
上建立索引,您可能会得到一个嵌套的循环联接,TVF作为驱动表,这意味着它只执行一次

如果它没有索引,并且您得到一个散列或合并联接,那么这两个方法只处理两个输入一次


内联TVF被合并到查询本身中。所以函数本身永远不会这样执行。但是,SQL Server随后可以引用基数信息,并可能对计划进行排序,以便TVF中包含的查询显示在嵌套循环联接的内侧,并且执行次数大于一次。

我非常确定它将只执行一次。但是,我建议您使用SQLServerManagementStudio中的“显示执行计划”选项进行检查。不知道TableValueFunction的功能是什么,我们无法真正告诉您是否有更好的方法。您是说多语句TVF还是内联TVF?@Martin:这是内联TVF。+1谢谢!参数是常量。如果只执行一次,您能解释一下它是如何缓存结果的吗?每个事务缓存?@CharithJ-TVF很可能被用作嵌套循环联接的驱动输入,因此它不需要缓存任何结果。每一行在出来时都将被处理,以查找到Patients表中。或者,如果要将TVF连接到自身,则可以将其作为哈希连接的构建输入,但它可能会执行多次,或者您可能会在缓存结果的计划中看到一个假脱机。+1感谢您的解释,这是一个内联TVF。所以希望只执行一次。。。