拥有大量数据库视图是否可以?

时间:2008-09-02 17:58:52

标签: sql sql-server database database-design crystal-reports

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

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

是否可能有太多的数据库视图?什么是最佳实践?

4 个答案:

答案 0 :(得分:8)

在大多数情况下,没关系。是的,SQL Server在分析SELECT * FROM表时会有更多的选择(它必须查看'table'的系统目录)但是它已经针对它进行了高度优化,并且只要你有足够的RAM(现在大多数服务器都这样做) ,你不会注意到0到1,000个观点之间的差异。

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

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

答案 1 :(得分:2)

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

话虽如此,当您从视图中进行选择时,视图定义查询将与您正在运行的查询一起运行。

例如,如果vwCustomersWhoHavePaid为:

Select * from customers where paid = 1

并且您正在运行的查询将返回8月初之后已付款的客户,其格式如下:

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

您实际运行的查询是:

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

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

答案 2 :(得分:1)

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

无论如何,最佳做法是整合可以合并的内容,删除可以删除的内容,如果它只是由报表使用,请为视图选择一致的命名标准,以便在查找时可以轻松地将它们组合在一起特别的观点。

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

- Kevin Fairchild

答案 3 :(得分:1)

你问:幕后发生了什么?

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

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

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