是否执行了视图列集中的所有函数,即使它们没有在查询中显式引用?

Posted

技术标签:

【中文标题】是否执行了视图列集中的所有函数,即使它们没有在查询中显式引用?【英文标题】:Are all functions in a view's column set executed, even if they aren't explicitly referenced in a query? 【发布时间】:2020-03-05 16:25:11 【问题描述】:

假设我有一个视图定义,例如:

CREATE VIEW dbo.view1
AS
SELECT col1
       , col2
       , dbo.Function(col3) AS col3
  FROM table1

现在假设我进行以下查询:

SELECT col1
  FROM view1

在这种情况下是否会执行该函数,因为它没有在查询中被引用?

提前致谢。

【问题讨论】:

您的实验向您展示了什么?执行计划有何建议? 优化器应该能够确定不需要执行该函数。是否这样做可能取决于产品的特定版本(直至补丁级别)、数据量、月相等。如果您想知道优化器 做了什么,您需要询问执行计划。 也许;视图不能解决任何问题,因此查询应该作为其执行的一部分被重新编写和重新计划(即优化器会将您的查询放在视图上并将所有内容下推,就好像您正在运行查询一样而是在视图中编码,列更少),我认为运行的结果查询很可能不会对函数有任何引用 稍微绕道......但如果你有一个标量函数作为列值,你应该考虑修复它。 Larnu - 良好的调用 - 执行计划表明如果未引用该列,则不调用该函数。早该想到的! 【参考方案1】:

感谢 Larnu 建议检查执行计划,我确定至少在我上面概述的情况下,如果未引用该列,则不会执行该函数。

【讨论】:

以上是关于是否执行了视图列集中的所有函数,即使它们没有在查询中显式引用?的主要内容,如果未能解决你的问题,请参考以下文章

高级查询

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

有效地从子查询中选择多个列(放置在 SELECT 线索中)

MySQL-查询

MySQL 视图 - 使用或不使用 [关闭]

mysql查询数据