我们有一个非常大的S3存储桶,它按日期分为多个文件夹。例如
我通过 Redshift 运行查询,并被指示始终按 dt 字段进行过滤以降低成本。
现在我正在尝试编写一个脚本来动态查询最近 2 天的数据,并且想知道哪种方法最快/最便宜:
SELECT ... FROM src WHERE dt >= CAST(DATEADD (day,-1,GETDATE ()) AS DATE)
CREATE TEMPORARY TABLE var AS (SELECT CAST(DATEADD (day,-1,GETDATE ()) AS DATE) AS yday);
SELECT ... FROM src WHERE dt >= (SELECT yday FROM var)
CREATE TEMPORARY TABLE var AS (SELECT CAST(DATEADD (day,-1,GETDATE ()) AS DATE) AS yday);
SELECT ... FROM src JOIN var ON src.dt >= var.yday
或者有没有更好的方法我还没想到?
查询 Redshift 时,最小化成本并提高性能是关键。在您列出的方法中,最快且最具成本效益的方法通常会避免不必要的中间步骤,例如创建临时表,除非它们能带来切实的好处。
所以最好坚持使用日期过滤器直接查询:
SELECT ... FROM src WHERE dt >= CAST(DATEADD(day, -1, GETDATE()) AS DATE);
其他一些可以提高性能的技巧:
按 dt 对 S3 数据进行分区:如果您的 S3 数据按 dt 进行分区,Redshift Spectrum 可以自动修剪不必要的分区,从而降低扫描成本。
使用 SORT KEY:确保 dt 是 Redshift 表中 SORT KEY 的一部分,这有助于优化范围查询,例如 dt >=。
压缩 S3 中的数据:对 S3 存储桶使用 Parquet 或 ORC 等压缩格式,以减少扫描时间和成本。