Redshift Spectrum - 在 CTE 中引用外部 table?

Redshift Spectrum - Referencing an external table in a CTE?

我正在尝试通过 Redshift Spectrum 向我们的报告平台提供一些数据。我选择 Spectrum 是因为它为我们的数据湖提供了比批量 ETL 过程更低的延迟。

我有一个查询看起来像这样

with txns as (select * from spectrum_table where ...)
select field1, field2, ...
from txns t1
left join txns t2 on t2.id = t1.id
left join txns t3 on t3.id = t1.id
where...

直觉上,这应该使用 CTE 在内存中缓存 Spectrum 查询输出,并使其可用于稍后查询,而无需第二次(或第三次)访问 S3。

但是,我检查了解释计划,每加入一次,“S3 Seq Scan”的数量就会增加一个。所以它似乎在每次查询 CTE 时都进行 Spectrum 扫描。

问题:

  1. 这真的发生了吗?还是解释计划有误?此查询的 运行 时间似乎并未随连接数线性增加,因此很难判断。

  2. 如果发生这种情况,还有哪些其他选择可以实现这种结果?除了手动创建一个临时文件 table(这将通过报告工具访问,所以我宁愿避免允许显式写访问或需要多个语句来获取数据)

谢谢!

  1. 是的,这真的发生了。 CTE 引用不会被重复使用——这是因为不同的引用可能会使用不同的数据。在 table 扫描时应用 where 子句是一个重要的性能特征。

  2. 您可以考虑使用物化视图,但我希望您在 CTE 中动态应用 where 子句,因此这可能不符合您的需要。如果是我,我会想明白为什么三重 self-join。似乎有更好的方法来构建查询,但这只是一种直觉。