Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有很多数据库视图可以吗?_Sql_Sql Server_Database_Database Design_Crystal Reports - Fatal编程技术网

Sql 有很多数据库视图可以吗?

Sql 有很多数据库视图可以吗?,sql,sql-server,database,database-design,crystal-reports,Sql,Sql Server,Database,Database Design,Crystal Reports,我很少每月/每季度使用Microsoft SQL Server 2005数据库视图生成数百份Crystal报告。这些视图是否在我没有从中读取的所有时间内都在浪费CPU周期和RAM?我应该使用存储过程、临时表还是短期的普通表,因为我很少从视图中读取数据 我不是DBA,所以我不知道数据库服务器背后发生了什么 是否可能有太多的数据库视图?最佳实践是什么?在大多数情况下,这并不重要。是的,SQL Server在解析SELECT*FROM表时会有更多的选择。它必须在系统目录中查找“table”,但它为此进

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

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


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

在大多数情况下,这并不重要。是的,SQL Server在解析SELECT*FROM表时会有更多的选择。它必须在系统目录中查找“table”,但它为此进行了高度优化,如果您有足够的RAM,那么现在大多数服务器都会这样做,您不会注意到0和1000个视图之间的差异

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


视图的主要观点是将业务逻辑封装到一个伪表中,这样您就可以拥有一个person表,但随后一个名为active_persons的视图就发挥了一些神奇的作用。为每个报表创建一个视图有点傻,除非每个报表都是孤立的、唯一的,无法重复使用。

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

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

此外,除非您真的需要事务性隔离,否则请考虑在查询中使用NoLoCK表提示。


-Kevin Fairchild

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

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

例如,如果已付款的客户是:

Select * from customers where paid = 1
您正在运行的查询将返回在8月1日之后付款的客户,其格式如下:

Select * from vwCustomersWhoHavePaid where datepaid > '08/01/08'
您实际运行的查询是:

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

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

你会问:幕后发生了什么

视图是一组SQL文本。当查询使用视图时,SQL Server会将该SQL文本放入查询中。这发生在优化之前。结果是优化器可以考虑组合代码而不是两个单独的代码块来执行最佳执行计划。 您应该查看查询的执行计划!那里有很多东西要学


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

我同意答案,但不同意NOLOCK的建议。我看到很多人只是到处放NOLOCK,然后想知道为什么他们会有一致性问题。这样的条款有它的用途,但大多数时候它被滥用,我不建议这样使用它。使用READ_COMMITTED_SNAPSHOT是避免锁定的更好选择。@Diego,任何东西都可能被滥用;但是对于简单的查询,尤其是当你不完全关心脏读的时候,它真的没有人们想象的那么糟糕。见鬼,StackOverflow甚至在很多查询中使用它。另请参见:但在一天结束时,这是一个判断电话。。。并且需要基于您的数据和您愿意做出的潜在权衡。没错,正是这样,太多人将NOLOCK视为圣杯,使他们编写的查询变得糟糕。许多开发人员不知道、不喜欢或仅仅是SQL的cr.p,他们试图避开它;与代码审查和繁重的重构相比,NOLOCK似乎是一条简单的逃生之路。我必须维护一个完全建立在nolock之上的系统,删除一个会导致它崩溃。这太糟糕了,以至于我每天都在和开发人员激烈争论,以至于他们都是无锁崇拜者。我说如果有疑问,不要用它。如果你确定,不要使用它