3

我正在使用 MS SQL Server。

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

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)

稍后(在运行时)我在 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

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

我的问题是:

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

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

4

2 回答 2

4

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

于 2008-12-29T20:07:36.180 回答
0

在 Management Studio 中显示查询的执行计划后,您可以使用鼠标将鼠标悬停在执行计划中的节点上。

悬停时,会显示一个大的工具提示:其中包括该节点检索到的字段的“输出列表”,以及显示读取这些字段的实例数的“估计行数”字段。

于 2008-12-29T21:34:04.117 回答