arrays - 查找包含另一个数组子集的数组而不使用 @> 与 postgreSQL

标签 arrays postgresql greenplum

我有一张包含 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/

相关文章:

arrays - D 动态数组初始化、stride和索引操作

javascript - 循环遍历多维数组

ios - JSON 到自定义对象数组 (Swift)

ruby-on-rails - PG::UndefinedColumn:如果同一数据库用于在 Rails 中相互连接的两个不同项目,则出现错误

hadoop - Pivotal HDB - 如何将数据从 HAWQ 内部/外部可读表推送到 Greenplum

postgresql - 修改 COALESCE 函数以考虑结果的两个相邻值

python - 基于 2D numpy 索引数组排列 numpy 2D 数组的 numpy 方式是什么?

ruby-on-rails - ActiveRecord 或 Postgresql 创建新记录时设置错误的 ID

postgresql - SQL Prepare语句返回语法错误

sql - 按相同值对分区进行排序