我有一个 2B+ 行外部表,我正在使用 Redshift Spectrum 读取该表。有两个相关列 - key_col (BIGINT) 和partition_col (VARCHAR)。 partition_col 是一个分区列,大约有 50 个分区。
我需要查找 key_col 中是否有重复值,如果有,则标记它们所在的分区。如果存在,保证它们位于同一个分区中。
目前,这正在通过
完成SELECT
COUNT(key_col) as occurences,
partition_col
FROM my_table
GROUP BY
partition_col,
key_col
HAVING
occurences > 1;
但是,随着数据量的增加,这可能会非常慢。看看 EXPLAIN 计划,Redshift 似乎没有进行优化以利用 partition_col 是一个分区的事实,而只是对所有分区上的所有partition_col/key_col 对进行 HashAggregate。我认为(?)可以通过在每个分区内执行 HashAggregate 来完成,这将大大减少完成完整查询所需的比较次数。这可能正在完成,只是从解释计划中还不清楚,但无论如何我的问题是:
如何重写此查询以显式利用分区(或者不可能)?
我尝试了一些使用 LAG 和 ROW_NUMBER 窗口函数以及 PARTITION BY partition_col 的方法,但是虽然逻辑非常简单,但都需要按 key_col 排序,由于体积的原因,这也非常慢。
尝试在窗口函数中使用 redshift 的
PARTITION BY
子句:
WITH partition_duplicates AS (
SELECT
key_col,
partition_col,
COUNT(*) OVER (PARTITION BY partition_col, key_col) AS occurrences
FROM my_table
)
SELECT
key_col,
partition_col
FROM partition_duplicates
WHERE occurrences > 1;