我支持SQL Server 2000到2008R2(所有标准版)。
问题1
请考虑以下假设情况。假设您有一个5表视图,表内连接。让我们进一步假设我从每个表中提取10个字段,因此我有一个视图,其中总共有50个字段。如果我从视图中只选择了2个字段(两个表中每个字段中有一个),那么假设您拥有所有相同的表和连接,那么该查询是否会比等效的表连接脚本慢?
问题2
如果我用这样的脚本创建了一个通用视图怎么办:
Create View SomeView
AS
select * from SomeTable
Go
这些表定期添加字段。每次我向“SomeTable”添加一个字段时,视图会自动生效,对吗?这明显慢了吗? 如果我SomeTable有50个字段,我从通用视图中选择了其中两个?如果我从Select *视图中选择两个字段,它是否只查询这些字段?
问题3 如果我创建类似以下的视图
Create View Blah
AS
select (some fields)
from TableA join TableB on TableA.Blah = TableB.Blah
Go
然后我使用这样的视图:
Select (some fields) from dbo.Blah where SomeDate >= '1/1/2008'
我会失去任何表现吗?优化器实际上只会提取应用的视图记录,还是会全部拉出然后再选择结果集?
TIA。
答案 0 :(得分:2)
每次我向“SomeTable”添加一个字段时,视图会自动生效,对吗?
不,请看这里how to make sure that the view will have the underlying table changes by using sp_refreshview
优化器实际上只会提取应用的视图记录,还是会全部拉出然后再选择结果集?
视图只是一个存储的查询,优化器足够智能,只需要搜索或扫描所需的数据,您可以通过查看执行计划来验证这一点
所以我有一个共有50个字段的视图。如果我从视图中只选择了2个字段(两个表中的每个字段中有一个),那么假设您拥有所有相同的表和连接,该查询是否会比等效的表连接脚本慢?
再次使用*和仅2列对查询运行统计信息io或时间,看看您是否看到读取和时间的差异
所以例如
SET STATISTICS IO ON
GO
SELECT * FROM SomeView
SET STATISTICS IO OFF
GO
SET STATISTICS IO ON
GO
SELECT Col1, Col2 FROM SomeView
SET STATISTICS IO OFF
GO