在下面的查询中,如果Patients表有1000条记录,TableValueFunction执行了多少次?只有一次或1000次?
这是一个存储过程中的查询,您是否有更好的想法来改进它?
SELECT * FROM Patients
WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..))
答案 0 :(得分:4)
这取决于您使用的参数。如果参数是常量,则函数将执行一次但如果参数是来自Patients
的字段,则函数将执行与表Patients
中的行一样多的次数。
答案 1 :(得分:1)
在某种程度上,这取决于您是在谈论内联TVF还是多语句。
多语句TVF对查询优化器完全不透明。它总是假定它将返回1行,并且它不会扩展到主查询中。
由于1行假设,如果您的Patients表在PatientId
上编入索引,您可能会获得嵌套循环加入TVF作为驱动表,这意味着它只执行一次。
如果它没有被索引并且你得到一个哈希或合并连接这两种方法只处理两个输入。
内联TVF会合并到查询本身。因此,函数本身永远不会被执行。但是,SQL Server可以引用基数信息,并可能对计划进行排序,使得TVF中包含的查询出现在嵌套循环连接的内侧,并且执行次数大于1。