【问题标题】:Is it okay to have a lot of database views?有很多数据库视图可以吗?
【发布时间】:2010-09-07 14:21:10
【问题描述】:

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

我不是 DBA,所以我不知道数据库服务器的幕后情况。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      例如,如果 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'
      

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

      【讨论】:

        【解决方案3】:

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

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

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

        -- 凯文·费尔柴尔德

        【讨论】:

        • 我同意这个答案,但不同意 NOLOCK 的建议。我看到很多人只是把 NOLOCK 放在任何地方,然后想知道为什么他们会遇到一致性问题。此类子句有其用途,但大多数时候都被滥用,我不建议“就这样”使用它。使用 READ_COMMITTED_SNAPSHOT 是避免锁定的更好选择。
        • @Diego,anything 都可以被滥用 ;) 但是对于简单的查询,尤其是当你完全不关心脏读时,它真的没有人们想象的那么糟糕出来。哎呀,StackOverflow 甚至在它的大量查询中使用它。另请参阅:codinghorror.com/blog/2008/08/deadlocked.htmlstackoverflow.com/a/1453087/3743 不过,归根结底,这是一个判断电话......并且需要基于您的数据以及您愿意做出的潜在权衡。
        • 是的,只是太多人将 NOLOCK 视为圣杯,使他们编写的糟糕查询得以发挥作用。许多开发人员不知道、不喜欢 SQL,或者只是对 SQL 不屑一顾,他们试图避开它;与代码审查和大量重构相比,NOLOCK 似乎是一条轻松的逃生路线。我必须维护一个完全建立在 NOLOCKS 上的系统,删除一个系统会导致它崩溃。这太糟糕了,以至于我每天都与开发人员激烈争论,以至于他们是“NOLOCK 崇拜者”。我说“如有疑问,请不要使用它。如果您确定,请不要使用它”。 :)
        【解决方案4】:

        你问:幕后发生了什么?

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-02
          • 2017-05-18
          • 1970-01-01
          • 2015-05-04
          • 2023-03-13
          • 1970-01-01
          相关资源
          最近更新 更多