我很少(每月/每季度)使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告。在我不读取这些视图的所有时间里,这些视图是否会浪费 CPU 周期和 RAM?因为我很少从视图中读取数据,所以我应该使用存储过程、临时表或短期普通表吗?

我不是 DBA,所以我不知道数据库服务器内部幕后发生了什么。

数据库视图是否可能过多?什么被认为是最佳实践?

有帮助吗?

解决方案

在大多数情况下,这并不重要。是的,SQL Server 在解析 SELECT * FROM table 时会有更多选择(它必须在系统目录中查找“表”),但它对此进行了高度优化,并且前提是您有足够的 RAM(现在大多数服务器都有) ,您不会注意到 0 和 1,000 次观看之间的差异。

然而,从人的角度来看,试图管理和弄清楚“数百个”视图正在做什么可能是不可能的,所以你可能有很多重复的代码。如果嵌入这些冗余视图中的某些业务规则发生变化,会发生什么情况?

视图的主要观点是将业务逻辑封装到伪表中(因此您可能有一个人员表,但随后有一个名为“active_persons”的视图,它具有一些魔力)。为每个报告创建视图有点愚蠢,除非每个报告都如此孤立和独特以至于无法重复使用。

其他提示

视图是您经常使用预设参数运行的查询。如果您知道您将始终查看相同的数据,则可以创建一个视图以方便使用和数据绑定。

也就是说,当您从视图中选择时,定义查询的视图将与您正在运行的查询一起运行。

例如,如果 vwCustomersWhoHavePaid 是:

Select * from customers where paid = 1

您运行的查询返回八月一日之后付款的客户,格式如下:

Select * from vwCustomersWhoHavePaid where datepaid > '08/01/08'

您实际运行的查询是:

Select * from (Select * from customers where paid = 1) where datepaid > '08/01/08'

创建视图时应该记住这一点,它们是存储您经常查看的数据的一种方式。这只是一种组织数据的方式,以便更容易访问。

视图只会在调用时占用 cpu/内存资源。

无论如何,最佳实践是合并可以合并的内容,删除可以删除的内容,如果它实际上仅由您的报表使用,请为视图选择一致的命名标准,以便在查找特定视图时可以轻松地将它们分组在一起。

另外,除非您确实需要事务隔离,否则请考虑在查询中使用 NOLOCK 表提示。

——凯文·费尔柴尔德

你问:幕后发生了什么?

视图是一堆 SQL 文本。当查询使用视图时,SQL Server 会将 SQL 文本放入查询中。这发生在优化之前。结果是优化器可以考虑组合代码而不是两个单独的代码以获得最佳执行计划。

您应该查看查询的执行计划!那里有很多东西要学。

SQL Server还有一个概念 聚类视图. 。A 聚类视图 是系统维护的结果集(基础表上的每次插入/更新/删除都会导致基础表上的插入/更新/删除 聚类视图的数据)。认为视图的运作方式是一个常见的错误 聚集视图 操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top