【问题标题】:PostgreSQL: Create an index for fields within a composite type?PostgreSQL:为复合类型中的字段创建索引?
【发布时间】:2013-02-23 11:41:16
【问题描述】:

是否可以在复合类型的某个字段上建立索引?例如,假设我创建了一个类型

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);

并且希望在ri 上拥有一个(尤其是哈希/GIST/GIN)索引,这可能吗?

同样,是否可以在数组字段的第一个、第二个、第三个...元素上设置索引?

假设我使用complex[],是否有可能对所有complex[0]、所有complex[1]等都有一个索引?

【问题讨论】:

  • 高级索引使用,可能适合迁移到dba.SE

标签: postgresql types indexing


【解决方案1】:

是的,绝对有可能。使用expression index。棘手的部分是syntax for composite types

复杂类型元素上的 B-tree 索引:

CREATE TABLE tbl (tbl_id serial, co complex);

CREATE INDEX tbl_co_r_idx ON tbl (((co).r)); -- note the parentheses!

dbfiddle here - 与 EXPLAIN ANALYZE
sqlfiddle

同样的事情适用于数组的预定元素(不适用于整个数组!),即使是复合类型的数组:

CREATE TABLE tbl2 (tbl2_id serial, co complex[]);

CREATE INDEX tbl2_co1_idx ON tbl2 ((co[1])); -- note the parentheses!

请注意,如果表达式或多或少按字面意思匹配,则表达式索引只能用于查询。

但这对于您提到的 GIN 索引没有意义。 The manual:

GIN 代表广义倒排索引。 GIN 专为 处理要索引的项目是复合值的情况,以及 索引要处理的查询需要搜索元素 出现在复合项目中的值。

一个 GIN 索引对于复杂类型的数组是有意义的作为一个整体,让您可以搜索其中的元素。但是您需要针对您的特定类型的实现。这里是一个list of examples in standard Postgres(除了对所有一维数组的基本支持)。

【讨论】:

  • 感谢您非常详细和好的回答!也感谢关于 GIN 的提示,您完全正确!
  • @Erwin Brandstetter 您的第二种情况/示例也非常接近我的需要。虽然我需要能够查询在 co 中具有与某些谓词匹配的元素的行 -> 虽然不一定在整体上,但只说 r 字段。是否有某种方法可以将数组“取消嵌套”到单个 GIN 索引中,或者以某种方式对所有内部 co.r 字段进行 btree 索引,而不仅仅是一个数组条目的 r 字段。所以基本上 ANY 在复合/复杂类型上,带有 ((co).r) 类似索引。
  • @Climax:请以 question 的形式提出您的问题。您可以随时链接到此链接以获取上下文,并在此处添加评论以链接回。
  • @ErwinBrandstetter 我在 dba 堆栈中创建了问题dba.stackexchange.com/q/307484/69985
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2019-04-16
  • 2013-03-29
相关资源
最近更新 更多