【发布时间】:2016-09-12 21:23:50
【问题描述】:
假设我有一个名为 Table1 的(假设的)表,有 500 列,并且有一个名为 View1 的视图,基本上是
select Column1, Column2,..., Column500, ComputedOrForeignKeyColumn1,...
from Table1
inner join ForeignKeyTables .....
现在,当我执行类似
的操作时Select Column32, Column56
from View1
SQL Server 将其变成以下 3 个中的哪一个?
查询 #1:
select Column32, Column56
from
(select
Column1, Column2,..., Column500, ComputedOrForeignKeyColumn1,...
from
Table1
inner join
ForeignKeyTables ......) v
查询 #2:
Select Column32, Column56
from Table1
查询 #3:
select Column32, Column56
from
(select Column32, Column56
from Table1) v
我问这个的原因是我确实有一个非常宽的表和一个位于其顶部的视图(基本上是内部连接以从所有外键 ID 中获取文本),我无法确定 SQL服务器获取所有列,然后选择需要的列或仅获取需要的列(同时也忽略不必要的连接等)...如果是前者,那么视图将不是最好的性能。
【问题讨论】:
-
很可能是非常接近 #1 的东西 - view 只是一个 stored 语句 - 视图通常是 not旨在提高性能 - 这不是他们的主要目标 - 而是为不同的用户/流程组提供定制的数据“视图”
-
您应该知道您的“查询 #1”不会获取所有列。查询作为一个整体进行了优化。如果子查询包含外部查询随后忽略的列,则优化器应该能够生成和使用无法返回该列的计划。在 SQL 中,你告诉系统你想要什么,而不是如何去做。
标签: sql-server