在没有易失表的情况下优化 Teradata 中的巨大价值列表

Optimizing huge value list in Teradata without volatile tables

有一个类似`

的值列表
`where a.c1 in ( list ) `

然后将列表推入 volatile table 是最好的出路。然而,这是通过 cognos 完成的,IBM 不够聪明,无法知道 Teradata 的 volatile table 是什么。 我希望它是这样我可以使用排除逻辑 Exists 来浏览易变的 table 内容。 所以没有 volatile table ,我有一个值列表 where a.c1 in ( list ) 它有 5K 个值。事实证明,将这份清单保留在报告中代价高昂。我想知道是否可以在将这种列表放入报告之前将其存储在某个地方。 CTE 和 using exists on a CTE 如何实现类似的收益。

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

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 
 )

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