关于观点的问题

时间:2010-12-22 16:01:37

标签: sql-server tsql sql-server-2000 sql-server-2008-r2

我支持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。

1 个答案:

答案 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