【问题标题】:PostgreSQL GIN index on array of uuiduuid 数组上的 PostgreSQL GIN 索引
【发布时间】:2013-11-26 09:44:16
【问题描述】:

我想在uuid[] 上使用 GIN 索引(对 uuid 数组进行有效的成员资格测试)。但是,当我尝试它时,PostgreSQL 给了我一个错误:

mydb=> CREATE TABLE foo (val uuid[]);
CREATE TABLE
mydb=> CREATE INDEX foo_idx ON foo USING GIN(val);
ERROR:  data type uuid[] has no default operator class for access method "gin"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

如何添加必要的运算符类以使其正常工作?

请注意,thiscitext 类型的问题类似,但提供的答案不起作用。

【问题讨论】:

    标签: arrays postgresql indexing uuid


    【解决方案1】:

    注意:此答案已过时,因为它现在是标准 PostgreSQL 的一部分,请参阅 tbussmann 的其他答案(您应该支持)。

    原答案:

    这可以使用以下操作符类来完成:

    CREATE OPERATOR CLASS _uuid_ops DEFAULT 
      FOR TYPE _uuid USING gin AS 
      OPERATOR 1 &&(anyarray, anyarray), 
      OPERATOR 2 @>(anyarray, anyarray), 
      OPERATOR 3 <@(anyarray, anyarray), 
      OPERATOR 4 =(anyarray, anyarray), 
      FUNCTION 1 uuid_cmp(uuid, uuid), 
      FUNCTION 2 ginarrayextract(anyarray, internal, internal), 
      FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal), 
      FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal), 
      STORAGE uuid;
    

    感谢this 为我指明了正确的方向。

    相关文档在Interfacing extensions to indexes,其中特别描述了 GIN 的运算符策略和函数号。

    【讨论】:

    • 很想知道:添加 btree_gin 是否已经足够了,或者以上是否需要?
    • 不,btree_gin 不包括数组类型。
    • 请注意,您不能在 Heroku 或任何其他 postgres 主机上使用它,因为它需要超级用户权限才能创建运算符类!
    • 我尝试在 PostGres 9.6 上使用它,但运行它后我收到与 OP 相同的错误。我想也许 FOR TYPE _uuid 中的下划线是一个错字,但是当我创建 FOR TYPE uuid 时,我在创建索引时遇到另一个错误 cache lookup failed for type 3177436692 。有什么想法我可能做错了吗?
    • 升级怎么样?如果我们从 9.6 升级到版本 10,我们是否应该删除这个运算符类定义?
    【解决方案2】:

    从 PostgreSQL 10 开始,不再需要自定义运算符类 _uuid_ops,因为现在在 anyarry 上有一个通用的内置操作类 array_ops(请参阅:https://www.postgresql.org/docs/current/static/gin-builtin-opclasses.html

    【讨论】:

    • 感谢@tbussmann,我在原始答案中引用了您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    相关资源
    最近更新 更多