我有一张包含 1.5 MM
记录的表格。每条记录都有一个行号
和一个数组
,数组中有1 到1,000 个
元素。我正在尝试查找属于较大数组子集的所有数组。
当我使用下面的代码时,我得到错误:语句需要比资源队列允许的更多的资源(可能是因为有超过一万亿种可能的组合):
select
a.array as dup
from
table a
left join
table b
on
b.array @> a.array
and a.row_number <> b.row_number
除了使用 @>
之外,是否有更有效的方法来识别哪些数组是其他数组的子集并将它们标记为要删除?
最佳答案
您的示例代码表明您只对查找作为表格另一行中任何 其他数组子集的数组感兴趣。
但是,您使用 JOIN
的查询会返回所有组合,可能会乘以结果。
尝试使用 EXISTS
半连接,只返回符合条件的行一次:
SELECT a.array as dup
FROM table a
WHERE EXISTS (
SELECT 1
FROM table b
WHERE a.array <@ b.array
AND a.row_number <> b.row_number
);
使用这种形式,Postgres 可以在找到第一个匹配项后立即停止迭代行。如果两者都不通过,请尝试分区您的查询。添加一个子句,如
AND table_id BETWEEN 0 AND 10000
并遍历表格。应该对这种情况有效。
旁白:很遗憾您的派生(Greenplum)似乎不支持 GIN 索引,这将使该操作更快。 (虽然索引本身会很大)
关于arrays - 查找包含另一个数组子集的数组而不使用 @> 与 postgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577681/