【问题标题】:Optimizing huge value list in Teradata without volatile tables在没有易失性表的情况下优化 Teradata 中的巨大值列表
【发布时间】:2016-02-04 22:13:57
【问题描述】:

有一个类似`的值列表

`where a.c1 in ( list ) `

然后将列表推到 volatile 表中是最好的出路。然而,这是通过 cognos 完成的,IBM 不够聪明,无法知道 Teradata 的 volatile 表是什么。 我希望这样我可以使用排除逻辑 Exists 来检查易失性表的内容。 所以没有 volatile 表,我有一个值列表 where a.c1 in ( list ) 它有 5K 的值。在报告中保留该列表被证明是昂贵的。我想知道是否可以在将此类列表放入报告之前将其存储在某个地方。 CTE 和使用存在于 CTE 上怎么样,是否会获得类似的收益。

【问题讨论】:

    标签: sql teradata volatile cognos query-tuning


    【解决方案1】:

    您可以将列表作为字符串传递,然后将其拆分为表格,例如对于整数列表:

    where a.c1 in
     (
       SELECT CAST(token AS INT)
       FROM TABLE (STRTOK_SPLIT_TO_TABLE(1, '1,2,3,4,5,6,7,8,9,5000', ',')
            RETURNS (outkey INTEGER,
                     tokennum INTEGER,
                     token VARCHAR(10) CHARACTER SET UNICODE)
                  ) AS dt 
     )
    

    当然优化器不知道返回的行数,所以最好检查一下解释...

    【讨论】:

    • 非常感谢。我会尝试一下,并在前后指标方面发布跟进
    • 我的列表是一个字符串列表,每个字符串是 10 个字符。我所做的只是排除连接where EXISTS ( sel '1' from table where vt.x=fct.y ) 的假脱机表。我不确定这个动态创建的表是否可以在其中使用。我想如果在使用条件fact.y=dt.token 在主查询中将 dt 指定为额外表之后,我必须进行内部连接?
    • 我刚刚尝试了NOT EXISTS/ EXISTS` 并且对两者都有一个奇怪的计划,只有加入和IN 看起来不错。你说的exclusion join表示NOT EXISTS,你可以用LEFT JOIN ... WHERE token IS NULL方法重写它
    • 刚刚跟进 - 影响 CPU 从 175K 下降到 5K。再次感谢一堆
    猜你喜欢
    • 2016-01-18
    • 2016-02-15
    • 2012-11-27
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2016-02-22
    • 2015-11-27
    相关资源
    最近更新 更多