SQL 视图中未使用字段的性能

Chr*_*isW 3 sql performance view query-analyzer

我正在使用 MS SQL Server。

当我定义数据库模式时,我定义了一个(非物化)视图,其中包括许多字段,例如如下(其中“Topic”是表的名称,视图是Topic表上的自联接) :

CREATE VIEW View_Topic_Ancestor AS
SELECT
    Subordinate.Id AS Subordinate_Id,
    Subordinate.Folder_Id AS Subordinate_Folder_Id,
    Subordinate.topicTitle AS Subordinate_topicTitle,
    Subordinate.topicXhtml AS Subordinate_topicXhtml,
    Subordinate.crossLinked AS Subordinate_crossLinked,
    Superior.Id AS Superior_Id,
    Superior.topicTitle AS Superior_topicTitle,
    Superior.topicXhtml AS Superior_topicXhtml,
    Superior.crossLinked AS Superior_crossLinked
FROM Topic AS Subordinate LEFT OUTER JOIN Topic AS Superior
ON Superior.Folder_Id = Subordinate.Folder_Id
AND 
Superior.LeftValue = (SELECT MAX(Ancestor.LeftValue)
    FROM Topic AS Ancestor
    WHERE Subordinate.LeftValue > Ancestor.LeftValue
    AND Subordinate.LeftValue < Ancestor.RightValue
    AND Subordinate.Folder_Id = Ancestor.Folder_Id)
Run Code Online (Sandbox Code Playgroud)

稍后(在运行时)我在 select 语句中使用此视图,如下所示:

SELECT
    T.Id AS Shared_Id,
    V.Superior_Id,
    V.Superior_topicTitle,
    V.Subordinate_Id,
    V.Subordinate_Folder_Id,
    V.Subordinate_topicXhtml
FROM Topic AS T, View_Topic_Ancestor AS V
WHERE Folder_Id='e2eb2b68-738d-49ad-9787-a1e655b7973f'
AND T.crossLinked = V.Subordinate_Id
Run Code Online (Sandbox Code Playgroud)

此 SELECT 语句不引用(不选择)视图中的许多字段:例如,它选择 Sublined_topicXhtml 字段,但不选择 Superior_topicXhtml 字段。

我的问题是:

1)在视图中定义但在视图的运行时选择中未引用的字段对性能有很大影响吗?假设您愿意,Superior_topicXhtml 字段包含大量数据(是一个很长的字符串)。

2)我如何自己验证这个答案?测试(用秒表测量经过的时间)是唯一的方法,还是有可能根据理论获得答案?我正在使用适用于 Microsoft SQL Server 2008 的“Microsoft Server SQL Management Studio”和 SQL Express。我了解如何获取(但尚未学会如何解释)此查询的“估计执行计划”,但这仅显示正在发生的索引和循环,而不显示是否从未引用的字段检索数据。

Cha*_*ana 5

查询优化器通过将定义视图的 sql 与您构造的从视图中“选择”的 sql 组合到单个 sql 查询中来创建查询计划。如果在这个组合的、优化的sql中,任何特定的属性(列)不是必需的,则不会使用它。具体来说,如果最终的选择不需要它,则不会通过网络发送它。此外,如果任何Where子句、Order By或优化sql中的任何其他子句都不需要它,并且所需的所有属性恰好都在索引中,那么该查询只能读取索引,而不会触及索引表根本...即使他视图引用了索引中不存在的列...您可以通过查看查询的查询执行计划来看到这一点。