视图和内联表函数之间是否存在性能差异?

时间:2018-01-30 22:03:56

标签: sql sql-server performance

我目前在使用视图和内联表函数之间的设计决策之间徘徊,支持视图的论点是它简单SELECT,但是表函数的参数是一致性,因为我们已经在数据库中有数百个需要参数的对象,因此使用表函数。

鉴于我们有一个表dbo.Data,一个视图,dbo.vData和一个内联表函数dbo.tfData()

我们的场景是我们已经在dbo.tfDataFilterBy(parameter)的行中为同一个表创建了几个表函数,因此在查询时具有一致性是一个明确的优点。绩效是我们走向哪个方向的重要因素。

新的视图和表格功能都只是做一个简单的SELECT * FROM dbo.Data。我已经测试了一些基本场景选择,连接和聚合,并且据我所知,执行计划是相同的。但是,是否有任何边缘情况可能会在它们之间产生不同的执行计划,可能有很多复杂的连接,子查询或者我们可能抛出的任何其他东西?

1 个答案:

答案 0 :(得分:0)

这两个以不同的方式定义,但是sql引擎以相同的方式从基表构建它们。(因此你的执行计划是相同的)

请记住,视图实际上可以更新底层基表,因此请注意这些差异。

请参阅:https://www.red-gate.com/simple-talk/sql/learn-sql-server/sql-view-basics/
有关视图使用的一些好信息。

如果在应用程序中重复使用视图,则可以将其定义为索引视图。然后,SQL Server将视图实现为表。这会在您对表进行更新时维护索引时产生一些开销,但索引视图可以显着提高读取性能。此外,在Enterprise Edition中,即使未直接引用,优化程序也可以使用索引视图(如果它满足查询要求)。

支持表函数的场合是需要定期更改表的定义的场合,您不希望维护多个定义非常接近的视图。此外,表函数可以使用可以在谓词中使用的参数来更改输出而不更改函数,使用不同谓词定义不同视图的视图。

这些不是唯一的差异,但在决定使用哪个时可能是最有影响力的两个。

与性能更直接相关:执行计划应该没有太大差异,除非您使用足够的视图以使优化器从定义中实现表格。