PostgreSQL中获取两个文本数组交集长度的最快方法

Nei*_*gan 8 postgresql performance array postgresql-9.3

这是我目前正在使用的:

CREATE FUNCTION array_intersect(a1 anyarray, a2 anyarray)
RETURNS anyarray AS
$$ 
  SELECT ARRAY(
    SELECT unnest($1)
    INTERSECT SELECT unnest($2)
    ORDER BY 1
  );
$$ LANGUAGE sql
IMMUTABLE STRICT;


--get the length:
select array_length ( array_intersect(array[...], array[...]), 1);
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法?

Eva*_*oll 2

  1. 你说你正在寻找“两个数组之间的杰卡德相似度”

    您可以考虑MadLib ,它提供了这样的功能dist_jaccard()

    被视为集合的两个 varchar 向量之间的 Jaccard 距离。

  2. 您可能想尝试不使用STRICT. 这可能会减慢速度。

  3. 您可能想使用INTERSECT ALL尤其是如果您知道 中没有重复的内容$1

  4. 正如 Craig Ringer 在评论中所说,您可能想退出intarray并考虑使用&.

为了在这里给出更准确的答案,

  • 数据类型有哪些?
  • 我们在每个数组上讨论多少个元素?
  • 提供多少排除INTERSECT