【问题标题】:Can GIN or GIST be used for an "containing at least" comparison?GIN 或 GIST 可以用于“至少包含”比较吗?
【发布时间】:2014-11-26 06:18:36
【问题描述】:

我正在使用扩展 intarray 与版本 9.2.9 进行 int 比较。

虽然&& 可以使用索引来过滤包含至少一个值的数组,但有没有办法使用 GIN 或 GIST 索引来过滤至少有 n 个值相交的数组?

例如,GIN 或 GIST 如何使用2 <= icount(ARRAY[1,2,3] & int_array_column)2 <= ARRAY_UPPER((ARRAY[1,2,3] & int_array_column),1)

【问题讨论】:

  • ARRAY[1,2,3] 需要是动态的吗?还是你总是有这些值 [1,2,3] ?
  • 是的,不幸的是这些值需要是动态的。
  • 问题不是很清楚......如果我理解正确,您正在尝试查找包含至少 n 个值的所有数组? (ARRAY[1,2,3] & int_array_column 是 Ruby/Sequel 的语法,用普通 SQL 编写简单的 ARRAY[1,2,3],对吧?)
  • 我试图找到一种方法来加速至少与 n 个值相交的数组相交查询。 & 是数组交集的 intarray 扩展函数。 icount(ARRAY[1,2,3] & int_array_column) 计算相交的值的数量,但需要进行全表扫描才能找到与至少 2 个以上值匹配的数组。

标签: arrays postgresql indexing


【解决方案1】:

Teodor Sigaev 的 smlar 扩展名具有我正在寻找的东西。 % 运算符索引 n 个相交值。

【讨论】:

    【解决方案2】:

    btree 可以索引您的表达式,然后过滤您需要的值的数量:

    CREATE INDEX my_awesome_ids 
    ON my_fat_table (icount(ARRAY[1,2,3] & int_array_column)); 
    
    SELECT * 
    FROM my_fat_table 
    WHERE 2 <= (icount(ARRAY[1,2,3] & int_array_column)); 
    

    【讨论】:

    • 数组需要是动态的,所以这个索引很遗憾不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多