【问题标题】:Alternative for a stored procedure for recursion in teradatateradata 中递归存储过程的替代方案
【发布时间】:2014-01-09 21:22:51
【问题描述】:

我正在使用下面的递归函数,它将循环超过 4500 次。在每次迭代中,代码将提取超过 50 条记录。

WITH RECURSIVE RECEMP (
    EMP_ID,
    EMP_DB,
    lvl,
    LEVEL
    )
AS (
    SELECT EMP_ID,
        EMP_DB,
        lvl,
        1 (INT)
    FROM EDW_MAN_WORK.emp --WHERE EMP_ID = 12

    UNION ALL

    SELECT E.EMP_ID,
        E.EMP_DB,
        E.lvl,
        R.LEVEL + 1
    FROM EDW_MAN_WORK.emp E
    INNER JOIN RECEMP R
        ON E.EMP_ID = R.EMP_ID
            AND R.LEVEL <= r.lvl
    )
SELECT EMP_ID,
    EMP_DB,
    Lvl,
    LEVEL
FROM RECEMP

由于 SPOOL 空间错误,我的查询失败。我们可以在递归表上收集统计信息吗?

我也尝试过使用存储过程,但这同样非常耗时。

请提出一种替代方法。

【问题讨论】:

  • 您的查询失败,因为它返回每一行 lvl + 1 次,因此您可以使用交叉连接轻松地将其重写为数字表。但是为什么需要这个结果集呢?您能否详细说明您实际尝试实现的目标?

标签: sql teradata


【解决方案1】:

不 - 您无法在 Teradata 中收集 CTE 的统计信息。

您在 CTE 和 EMP 表之间的连接似乎引入了无限循环。我不完全理解您试图建立的关系,但在我看来,从表面上看,您在 CTE 和 EMP 之间的连接应该是 E.EMP_DB = R.EMP_ID。我再次在这里做了一个很大的假设,即您试图用递归映射出的关系在EMP_DBEMP_ID 之间。

尽管如此,我还是建议您限制递归的深度作为保障。这可以帮助您在查询用完假脱机空间之前运行查询并获取一些结果。见下文:

WITH RECURSIVE RECEMP (
    EMP_ID,
    EMP_DB,
    lvl,
    LEVEL
    )
AS (
    SELECT EMP_ID,
        EMP_DB,
        lvl,
        1 (INT)
    FROM EDW_MAN_WORK.emp --WHERE EMP_ID = 12

    UNION ALL

    SELECT E.EMP_ID,
        E.EMP_DB,
        E.lvl,
        R.LEVEL + 1
    FROM EDW_MAN_WORK.emp E
    INNER JOIN RECEMP R
        ON E.EMP_ID = R.EMP_ID
            AND R.LEVEL <= r.lvl
           /* Depth Control - You expect a depth <= 50 */
           AND R.LEVEL = 60
    )
SELECT EMP_ID,
    EMP_DB,
    Lvl,
    LEVEL
FROM RECEMP

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多