Sql 嵌套数据库视图可以吗?

Sql 嵌套数据库视图可以吗?,sql,oracle,plsql,views,Sql,Oracle,Plsql,Views,在oracle的世界中,我的印象是基于其他视图的视图被认为是不好的做法。当试图解决性能问题和嵌套似乎过多,并且隐藏了底层视图中不必要的复杂性时,我自己也抱怨过这一点。现在我发现自己的处境是,它可能不是那么明确: 我有一些用户特别需要一个视图中的会计数字与另一个视图中对其进行进一步处理的会计数字相匹配。如果他们在其中一个方面做了任何改变,他们希望另一个能够立即反映出这一点,而不需要在几年内考虑到这一要求,也不需要在他们解决问题时报告显示不匹配的数字 在这种情况下嵌套视图可以吗 如果内部视图包含一个

在oracle的世界中,我的印象是基于其他视图的视图被认为是不好的做法。当试图解决性能问题和嵌套似乎过多,并且隐藏了底层视图中不必要的复杂性时,我自己也抱怨过这一点。现在我发现自己的处境是,它可能不是那么明确:

我有一些用户特别需要一个视图中的会计数字与另一个视图中对其进行进一步处理的会计数字相匹配。如果他们在其中一个方面做了任何改变,他们希望另一个能够立即反映出这一点,而不需要在几年内考虑到这一要求,也不需要在他们解决问题时报告显示不匹配的数字

在这种情况下嵌套视图可以吗


如果内部视图包含一个包含相关价格的更重要的视图,即您在确定价格时应该始终使用此视图,那么它是否会改变情况?

最佳实践并不总是涵盖所有内容。我认为嵌套它们有一个明确的理由,就这一次。

在构建复杂数据库查询的过程中,需要注意的一点是有时嵌套视图是最好的选择-例如,如果需要在两列上构建任何数学运算符,例如SUMCol1,Col2最好嵌套视图,这样sum本身就是一列,而不必执行类似的操作

选择总计/SUMCol1、Col2、SUMCol1、Col2*2、Col1/SUMCol1、Col2


但是我不确定我是否100%理解-为什么需要两个视图?难道两个用户都不能查看1视图并在该视图之上的另一层视图中派生进一步的处理吗?

我将视图嵌套在Oracle 10g R2的3层深处。性能似乎取决于视图中的select语句,而不是视图深度。特别是In子句似乎造成了很多麻烦。

我认为您正处在代码重用和性能冲突的下滑阶段。您可以尝试一下,看看它会对性能造成多大的影响。我们这里有两个数据库,它们在视图之上堆叠视图,坦率地说,性能很差,现在所有参与的人都希望他们没有这样设计。

使用视图的最佳理由是:

防止重复相同的查询。 防止其他查询编写器直接访问表 创建一个类似于2的安全层。
我确实意识到它也有助于简化更复杂的查询,但您会习惯它。您可能会发现,用户定义的函数表可能是更好的解决方案。无论哪种方式,性能都会受到影响。

在编码时间、代码的易用性或质量以及性能之间总是有一个折衷

嵌套视图真的很容易编码,并且在适当的情况下,使其易于阅读。它还可以减少时间。可以说,这降低了质量,而且往往降低了性能。。。但是要多少钱


都是主观的。如果说得通,就随它去吧。不要过早地优化您的代码。

嵌套视图的主要问题是,查询优化程序更容易混淆并生成次优计划。除此之外,在视图上使用视图没有特别的开销,除非它们做了一些优化人员无法将谓词下推的事情


这意味着最好的选择是尝试嵌套视图。看看你是否能从报告中得到合理的查询计划。如果它确实会导致问题,那么您可能必须重新考虑您的策略。

嵌套视图是有意义的。不过要小心,别把它们说得太笼统了

我确实看到过一个系统,它有一个视图,其中明确提到了14个表,其中一些表与外部自联接连接,而一些“表”本身就是视图。我不太喜欢它,但是DBMS处理得非常好,因为它是在80年代后期。许多模式是由数据建模工具机器生成的

CREATE VIEW IBB_V_Project AS
    SELECT  A.Project_Iref,
            A.Section_Iref,
            B.Section_Eref,
            N.Company_Iref,
            N.Company_Name,
            A.Product_Desc,
            A.Project_Type_Iref,
            D.Project_Type,
            A.Person_Iref,
            F.Full_Name,
            A.Respon_Iref,
            G.Post_Location,
            A.Project_Stat_Iref,
            E.Project_Status,
            A.Source_Iref,
            I.Source,
            A.Sic_Iref,
            L.Sic_Eref,
            A.Op_Activity_Iref,
            M.Op_Activity_Desc,
            A.Involve_Iref,
            K.IBB_Involvement,
            A.Nature_Iref,
            C.Nature_Of_Next_Act,
            A.Internat_Mobile,
            A.Whether_Cop_Case,
            A.Closed_Ind,
            A.Next_Action_Date,
            A.Creation_Date,
            A.Last_Edit_Date,
            A.Last_Editor_Iref,
            H.Logname

    FROM    IBB_Project A,
            IBB_Section B,
            IBB_R_Proj_Type D,
            IBB_R_Project_Stat E,
            IBB_Personnel H,
            OUTER IBB_R_Next_Act C,
            OUTER IBB_Personnel F,
            OUTER (IBB_Post_Respon X, OUTER IBB_V_Post_Resp2 G),
            OUTER IBB_R_Source I,
            OUTER IBB_R_Involvement K,
            OUTER IBB_Sic L,
            OUTER IBB_Op_Act M,
            OUTER IBB_V_Proj_Co2 N

    WHERE   A.Section_Iref      = B.Section_Iref
      AND   A.Project_Type_Iref = D.Project_Type_Iref
      AND   A.Project_Stat_Iref = E.Project_Stat_Iref
      AND   A.Last_Editor_Iref  = H.Person_Iref
      AND   A.Nature_Iref       = C.Nature_Iref
      AND   A.Person_Iref       = F.Person_Iref
      AND   A.Respon_Iref       = X.Respon_Iref
      AND   X.Respon_Iref       = G.Person_Iref
      AND   A.Source_Iref       = I.Source_Iref
      AND   A.Sic_Iref          = L.Sic_Iref
      AND   A.Op_Activity_Iref  = M.Op_Activity_Iref
      AND   A.Project_Iref      = N.Project_Iref
      AND   A.Involve_Iref      = K.Involve_Iref;
外部连接表示法是Informix特有的,Informix现在也支持SQL标准表示法

请注意,IBB_V_Post_Resp2和IBB_V_Proj_Co2本身都是视图。 事实上,IBB_V_Proj_Co2是一个三表视图,确切细节未知,但有很多 表格:

CREATE VIEW IBB_V_Proj_Co2 AS
    SELECT  A.Project_Iref,
            A.Some_Other_Col col01,
            B.Xxxx_Iref,
            B.Some_Other_Col col02,
            C.Yyyy_Iref,
            C.Some_Other_Col col03
    FROM    IBB_Project A,
            OUTER (IBB_R_Xxxx B, IBB_R_Yyyy C)
    WHERE   A.Xxxx_Iref = B.Xxxx_IrEf
      AND   B.Yyyy_Iref = C.Yyyy_Iref;
这意味着IBB_V_项目视图在上有一个外部自联接 IBB_项目。IBB_V_Post_Resp2视图可能涉及3个表 我的笔记也有点不清楚,早在1993年,当时我记录了这些信息

CREATE VIEW IBB_V_Post_Resp2 AS
    SELECT  A.Person_Iref,
            A.Some_Other_Col col01,
            B.Xxxx_Iref,
            B.Some_Other_Col col02,
            C.Yyyy_Iref,
            C.Some_Other_Col col03
    FROM    IBB_Personnel A,
            IBB_R_Xxxx B,
            IBB_R_Yyyy C
    WHERE   A.Xxxx_Iref = B.Xxxx_Iref
      AND   B.Yyyy_Iref = C.Yyyy_Iref;
Zzzz_Iref列是串行或整数外键 引用串行密钥

主视图定义引用了14个表,其中包含4个内部联接和9个内部联接 外部连接。当考虑交叉引用视图时,会出现以下情况:
总共有18个表,有7个内部联接和10个外部联接。

我将从最佳实践的角度回答:

对于在视图上使用视图,我只会暂停几次

内斯汀