基于查询性能和多语句表值函数等文章,SQL Server 假设多行表值函数返回一行。如果调用语句实际上返回许多行,这会导致为调用语句选择一个糟糕的执行计划。
添加SCHEMABINDING
到函数是否会导致函数返回值集的基数估计更正确?
如果我们假设我们将一个UserId传递给这个函数并返回一个允许用户访问的RecordId值表,并且一些用户只被允许看到一些记录,而一些用户被允许看到很多甚至所有记录,函数或调用语句(或包含它们的过程)是否会从使用中受益RECOMPILE
?函数中的使用会SCHEMABINDING
改变这个答案吗?
我意识到我可以通过实验来解决这个问题,但我希望有人已经找到了答案。指向有据可查的地方的指针会很有帮助。
在我的测试中,不,添加
WITH SCHEMABINDING
不会改善基数估计。我创建了一个简单的表:然后是两个函数:
比较实际计划,两者都显示估计行 = 1,实际行 = 2112(后一个数字可能在您的系统上有所不同,具体取决于版本/SP 等)。
速度对比:
结果:
那么,这很重要吗?没有。
SCHEMABINDING
在这种情况下,用于更重要的目标:底层架构稳定性。如果您追求将您的函数转换为内联 TVF,那么您可能会有更好的优化机会,而不是在多语句 TVF 中寻找影响计划的模糊差异。显然,使用 SQL Server 2017 ,只要您在数据库上使用 Compatibility Level 140,他们就可以通过Interleaved Execution改进 msTVFs 估计。