我正在使用MS SQL Server。
当我定义数据库模式时,我定义了一个(非物化的)视图,其中包含许多字段,例如如下所示(其中“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)
稍后(在运行时)我在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 Server的Microsoft SQL Server 2008“Microsoft Server SQL Management Studio”。我看到如何获得(但尚未学会如何解释)此查询的“估计执行计划”,但这仅显示正在发生的索引和循环,而不是是否从未引用的字段中检索数据。
答案 0 :(得分:4)
查询优化器通过将定义视图的sql与您构造的sql组合在一起来创建查询计划,从视图中“选择”为单个sql查询。如果在这个组合优化的sql中,不需要任何特定的属性(列),则不会使用它。具体来说,如果最终选择不需要它,它将不会通过线路发送。此外,如果任何Where子句或Order By或优化的sql中的任何其他内容不需要它,并且所需的所有属性恰好在索引中,那么该查询只能读取索引,而不是触及table at all ...甚至认为他查看引用索引中不存在的列...您可以通过查看查询的查询执行计划来查看。
答案 1 :(得分:0)
当您在Management Studio中显示查询的执行计划时,您可以使用鼠标将鼠标悬停在执行计划中的节点上。
当您悬停时,会显示一个大的工具提示:其中包含该节点检索的字段的“输出列表”,以及“估计的行数”字段,其中显示了这些字段的读取实例数。