【问题标题】:Using Views and CTE on DB2/AS400在 DB2/AS400 上使用视图和 CTE
【发布时间】:2018-10-11 14:41:42
【问题描述】:

一个通用问题..

我有一个员工表(EMPMAST),其中包含新旧员工数据。如果他/她是当前员工,则有一个名为Current? 的标志为“Y”。 现在我必须在我的 SQLRPGLE 中选择只有当前记录和一些其他条件的记录(例如EMPNAME = 'SAM')。处理它的最佳方法是什么。 (在性能和系统使用方面)

  1. 使用Current? = 'Y' 在EMPMAST 上创建一个视图。然后在其他条件的程序中使用它。
  2. 在程序中使用具有条件Current = 'Y' 的 CTE(With AS) 并使用它。
  3. 直接使用表格,无需 CTE 和 View
  4. 任何其他选项

【问题讨论】:

    标签: db2 ibm-midrange rpgle


    【解决方案1】:

    选项 1、2 和 3 都将执行相同的操作。它们可能都有相同的优化查询和访问计划。

    【讨论】:

    • 那么 2(CTE) 会不会更好,因为它不会在系统中创建永久视图(访问路径)?
    • 我不知道 iSeries 上的情况是否有所不同。视图只是一段 SQL,它与访问计划没有直接关系,至少在 Db2 for LUW 中没有
    • @AS400User 视图只是硬编码的 SELECT 语句,而 IBM i 访问路径是索引。 IBM i 上出现了混淆,因为当您使用 CRTLF / DDS 创建一个逻辑文件时,您可以给它一个键,这意味着您正在同时创建一个视图和一个索引。但是 CREATE VIEW 做不到。
    【解决方案2】:

    CTEView 是两个不同的东西。 View 适用于将在多个位置使用的查询,CTE 仅在定义它的查询中可用。除了替换复杂的子查询,我通常不使用CTE。在您的情况下,条件很简单,可以包含在 where 子句中,因此我认为不需要引入额外的复杂性。

    有些人会告诉你不要直接在程序中查询表,而要始终使用视图。这样,您在程序和数据库之间添加了一层额外的绝缘层,您仍然可以使用ExtName 定义记录结构,并且不必担心对表的更改,除非它们影响视图本身。在这种情况下,您可能会为每个使用该表的程序提供一个专用视图。

    我倾向于混合使用这些技术。我根据情况查询表、CTE 或视图,并在程序中明确定义我的记录结构。我更喜欢只查询表,但如果我有一些程序独有的复杂查询逻辑,我将使用 CTE。我确实有一些视图,但这些仅限于在多个程序中发生的查询,我希望确保一致地应用相同的逻辑。

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多