【问题标题】:Querying a query?查询查询?
【发布时间】:2012-06-11 12:46:19
【问题描述】:

假设我有五个名为 table1、table2 ... table5 的表。 我已经通过加入 table1、2 和 3 创建了一个名为 query1 的视图/查询。

现在,我想创建一个需要连接所有五个表的视图。我的问题是,是用query1,把table4和table5连接进去好,还是把五个表一个一个连接好?

恐怕如果我加入两个视图,或者一个视图和一个表/s,那么修改同一个视图需要我重建整个查询,因为它依赖于那个视图。

【问题讨论】:

    标签: sql-server database


    【解决方案1】:

    如果您不希望查询依赖于视图,那么您必须先问问自己,为什么要创建该视图。

    如果您的 5 表查询连接 table1table2table3 的方式恰好与在 query1 视图中连接相同表的方式相同但实际上具有完全不同的含义,那么,在我看来,在您的第二个视图/查询中使用query1 会很好

    但是,如果您的第二个视图/查询要重现已在 query1 中实现的相同业务规则,那么我认为复制代码绝对没有意义。这部分是一种观点:通过创建它,如果需要多次使用相同的代码,您可以避免重复。当您更改 query1 时,其他相关查询和/或视图相应地更改其输出是有意义的。

    当然,有时视图中的更改需要更改其他查询和/或使用它的视图。如果这是您目前最关心的问题,那么我建议您花时间适当地规划您的视图,以减少您的数据库在长时间使用后发生此类更改的可能性。

    因此,基本上,您的选择是在每个视图中复制逻辑以避免它们相互依赖,或者在必要时积极使用您的视图,但有可能遇到您必须仅仅因为一个特定的视图需要改变,就做出一连串的改变。但是,正如我之前所说,如果您事先正确设计您的视图,您可以最大限度地减少这种风险。

    【讨论】:

    • 提前计划的想法让我印象最深刻。这就是我认为以前隐藏的问题。
    • 然而,如果第二个 qwuery 将是一个视图,您应该重新创建代码。调用 ciew 的视图是数据库性能不佳的原因之一。它们维护起来也非常痛苦,而且这些人发现在顶部添加另一个视图比通过链来确定需要更改哪个视图更容易。您最终可能会加入同一个表 15 次并生成数百万条记录以获得结果集 3。我从应用程序开发人员的痛苦经历中知道这一点,尽管这是一个好主意。永远不要使用视图来调用视图。
    • @HLGEM:从性能的角度来看,并非每个调用视图的视图都是一个问题。是的,导致一组表多次自连接的那些可能会导致性能问题,但我认为这也是良好规划(或至少对现有代码库的适当分析)应该发挥作用的地方。如果不是这种情况(即多个自连接),则嵌套视图在性能方面非常好。 (至于嵌套本身引起的问题,我相信我已经在我的回答中涵盖了这些问题。)
    【解决方案2】:

    随心所欲。

    查询优化器将分析代码并构建相同的执行计划。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2019-03-26
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多