在没有易失表的情况下优化 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...
有一个类似`
的值列表`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...