使用SqlServer视图的缺点是什么?
我经常创建视图以以去规范化的形式显示我的数据。
相较于在许多表之间生成复杂的联接查询,我发现使用其中一个联接查询要简单得多,因此更快、不易出错、更具自文档化性质。尤其是当我从不同角度分析相同的数据(许多相同字段、相同表联接)时。
但是,创建和使用这些视图是否有成本?
我会减慢(或加速?)查询处理吗?
使用SqlServer视图的缺点是什么?
我经常创建视图以以去规范化的形式显示我的数据。
相较于在许多表之间生成复杂的联接查询,我发现使用其中一个联接查询要简单得多,因此更快、不易出错、更具自文档化性质。尤其是当我从不同角度分析相同的数据(许多相同字段、相同表联接)时。
但是,创建和使用这些视图是否有成本?
我会减慢(或加速?)查询处理吗?
在涉及到视图时,有优点和缺点。
优点:
缺点:
我个人的观点是不要使用视图,而应改用存储过程,因为它们提供了视图的安全性和封装性,同时也带来了更好的性能。
当视图包含未被最终查询使用的逻辑、列、行或表格时,视图可能会对性能产生负面影响。我不能告诉你有多少次我看到过这样的情况:
SELECT ...
FROM (View with complex UNION of ActiveCustomer and InactiveCustomer tables)
WHERE Active = True
SELECT (one column)
FROM (view that returns 50 columns)
SQL需要检索许多数据,然后在稍后的步骤中将其丢弃。可能那些其他列的检索成本很高,例如通过书签查找。
SELECT ...
FROM (view with complex filters)
WHERE (entirely different filters)
如果直接查询表格,很可能SQL可以使用更合适的索引,
或者SELECT (only fields from a single table)
FROM (view that contains crazy complex joins)
有很多CPU开销通过连接产生,以及为后来被丢弃的表读取而进行的不必要IO操作,或者是我最喜欢的:
SELECT ...
FROM (Crazy UNION of 12 tables each containing a month of data)
WHERE OrderDate = @OrderDate
SELECT (一个列) FROM (有50个列的视图)
- 在 SQL Server 2008 上查看执行计划,实际上已经被优化掉了。对于 SELECT (来自单个表的字段) FROM (具有疯狂复杂连接的视图)
也是一样的 - 执行计划会删除不需要的连接以提高查询效率。 - daiscog我也经常使用视图。然而需要注意的一点是,如果基础表经常更改(特别是在开发期间),使用大量视图可能难以维护。
编辑:话虽如此,我发现能够简化和重复使用复杂查询的方便性和优势超过了维护问题,尤其是如果视图被负责任地使用的话。
SQL Server中视图的各种限制是什么?
视图的前11个限制
来源:SQL MVP Pinal Dave
http://blog.sqlauthority.com/2010/10/03/sql-server-the-limitations-of-the-views-eleven-and-more/
我最大的不满是在视图中无法使用ORDER BY。虽然这很有道理,但如果没有预料到它可能会出现问题。因此,在一些情况下,为了不能在稍后指定ORDER BY,我不得不从使用视图转向使用SPROCS(它们本身就有足够多的问题)。(我希望有一个带有“FINAL VIEW”结构的构造——例如,可能包括order by——语义)。
http://blog.sqlauthority.com/2010/10/03/sql-server-the-limitations-of-the-views-eleven-and-more/ (限制#1是关于ORDER BY的:-)
create view toto1 as
select top 99.9999 percent F1
from Db1.dbo.T1 as a
order by 1
但是我的偏好是使用Row_Number
:
create view toto2 as
select *, ROW_NUMBER() over (order by [F1]) as RowN from (
select f1
from Db1.dbo.T1) as a