SQL server视图与内联TVF

SQL server视图与内联TVF,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,如果我们使用相同的select语句创建视图vw_myView和内联函数fn_myFunction。哪个是优化的? 下一个问题是,我是否将调用视图或函数的条件放在下面的位置: Select * from vw_myView where col1 = 'abc' Select * from vw_myFunction() where col1 = 'abc' 在执行计划的情况下,此处的where条件如何工作 哪一个是优化的?优化器通常最清楚,并将扩展嵌入式SQL查询作为计划的一部分;也就是说,内联

如果我们使用相同的select语句创建视图vw_myView和内联函数fn_myFunction。哪个是优化的? 下一个问题是,我是否将调用视图或函数的条件放在下面的位置:

Select * from vw_myView where col1 = 'abc'
Select * from vw_myFunction() where col1 = 'abc'
在执行计划的情况下,此处的where条件如何工作


哪一个是优化的?

优化器通常最清楚,并将扩展嵌入式SQL查询作为计划的一部分;也就是说,内联tvf可能存在参数嗅探问题(如果您有参数,在上面的示例中没有)。出于这个原因,我倾向于选择视图而不是内联tvf。

优化器通常最清楚,并将扩展嵌入式SQL查询作为计划的一部分;也就是说,内联tvf可能存在参数嗅探问题(如果您有参数,在上面的示例中没有)。因此,我倾向于选择视图而不是内联tvf。

视图和内联tvf都只是内联到外部查询计划中,就像您粘贴了文本一样。优化器对此没有任何特殊处理。对内联查询进行优化。视图和TVF之间从来没有性能差异。参数嗅探将影响整个查询


推送过滤器是一个可以依赖的琐碎优化。

视图和内联TVF都只是内联到外部查询计划中,就像您粘贴了文本一样。优化器对此没有任何特殊处理。对内联查询进行优化。视图和TVF之间从来没有性能差异。参数嗅探将影响整个查询


推动过滤器是一个可以依赖的琐碎优化。

当然,相反,如果你有参数,那么当然没有选择-视图不能参数化。如果我们有参数,那么执行计划会不同吗?我的意思是,如果我把一个参数传递给函数,让它处于where条件。如果我在视图的select查询中使用相同的where条件。在这种情况下,执行计划将是相同的?在您提供的特定示例中,执行计划中可能没有差异。在参数化TVF中,如果提供的参数影响包含的数据分布,则优化器可能会选择不准确的计划。当然,相反,如果您有参数,则当然没有选择-视图无法参数化。如果我们有参数,则执行计划将不同?我的意思是,如果我把一个参数传递给函数,让它处于where条件。如果我在视图的select查询中使用相同的where条件。在这种情况下,执行计划将是相同的?在您提供的特定示例中,执行计划中可能没有差异。在参数化TVF中,如果提供的参数影响所包含数据的分布,则优化器可能会选择不准确的计划。虽然OP没有参数化TVF,但通常可以依赖,但并非总是如此。@MartinSmith该限制似乎不是由于存在视图而产生的。将视图定义粘贴到同一查询中会导致相同的限制。当他通过分解视图来“概括”查询时,他更改了where谓词的位置。我不关心参数,我关心where条件,where条件在执行计划中的行为。在视图和内联函数的情况下,优化器的行为。该注释是对“推送where筛选器是一个可以依赖的琐碎优化”这一行的响应。如果这是真的,更改where谓词的位置不会有任何区别。@MartinSmith我现在明白了。我应该避免做这些一般性的陈述。通常可以依赖,但并非总是如此,尽管OP并没有将TVF参数化。@MartinSmith,这种限制似乎不是因为存在视图而产生的。将视图定义粘贴到同一查询中会导致相同的限制。当他通过分解视图来“概括”查询时,他更改了where谓词的位置。我不关心参数,我关心where条件,where条件在执行计划中的行为。在视图和内联函数的情况下,优化器的行为。该注释是对“推送where筛选器是一个可以依赖的琐碎优化”这一行的响应。如果这是真的,更改where谓词的位置不会有任何区别。@MartinSmith我现在明白了。我应该避免做这些笼统的陈述。不要试图学习“绝对”的绩效规则,然后严格遵守它们。我的建议-编写最简单的代码来完成您需要的工作(这里是一个视图)。然后测量性能。然后将绩效与您的绩效目标进行比较。如果它达到了这些目标,很好,工作完成了,进入下一个工作。如果没有,那么就开始分析性能问题所在并加以解决。不要试图学习“绝对”的性能规则,然后严格遵守它们。我的建议-编写最简单的代码来完成您需要的工作(这里是一个视图)。然后测量性能。然后将绩效与您的绩效目标进行比较。如果它达到了这些目标,很好,工作完成了,进入下一个工作。如果没有,那么就开始分析性能问题所在并加以解决。