【问题标题】:DB2 With ClauseDB2 带子句
【发布时间】:2014-03-26 18:30:04
【问题描述】:

我是 DB2 新手,对 with 子句有疑问。 例如在以下查询中:

WITH values AS 
   (
      SELECT user_id, user_data FROM USER WHERE user_age < 20
   )       
SELECT avg(values.user_data) FROM values
UNION
SELECT sum(values.user_data) FROM values

公用表表达式将执行多少次?将 with 子句的结果存储在临时表中还是会进行两次子选择。 (我在这里使用 with 和 union 只是为了举例,对不起我的英语不好)

【问题讨论】:

  • 执行它并查看计划,在sql-server这将执行两次。

标签: sql db2 common-table-expression


【解决方案1】:

正如@Vladimir Oselsky 所提到的,只看执行计划会给你一个明确的答案。在这个人为的示例中,CTE 子选择可能会运行两次。

【讨论】:

    【解决方案2】:

    在 DB2 中,公用表表达式应​​该在执行计划中创建公用表表达式节点(请参阅文档 here)。该节点明确表示:

    它们用作中间表。传统上,嵌套表 表达也服务于这个目的。然而,一个普通的表 表达式实例化后可以被多次引用; 嵌套表表达式不能。

    我的意思是 CTE 只评估一次、实例化,然后多次使用。此外,如果 CTE 仅被引用一次,则“实例化”会被优化掉。

    请注意,这是 Postgres 处理 CTE(物化子查询)的方式,而不是 SQL Server 处理它们的方式。

    【讨论】:

    • 为了完整起见,此答案特定于 DB2 for z/OS。
    • 在类似 DB2 的 dashDB 中,表被多次扫描。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多