首页 > 解决方案 > 数组和 tstzrange 的索引

问题描述

我正在尝试找到索引需要、和索引的表的btree最佳gin方法gist。表架构如下所示:

CREATE TABLE relationships (
  tenant_id       UUID            NOT NULL,
  relationship_id UUID            NOT NULL,
  node_id         UUID            NOT NULL,
  effective_range tstzrange       NOT NULL,
  parent_id       UUID,
  -- adjacency list of node_ids
  ancestors       UUID[]          NOT NULL DEFAULT ARRAY[]::UUID[],

  PRIMARY KEY (tenant_id, relationship_id, node_id, effective_range),
  EXCLUDE USING gist (
    tenant_id WITH =,
    relationship_id WITH =,
    node_id WITH =,
    effective_range WITH &&
  ),
  CONSTRAINT effective_range_enforce_bounds
    CHECK (lower_inc(effective_range) AND NOT upper_inc(effective_range))
);

我们使用这个表来查询我们节点的父母、孩子、祖先和死者。每行都有一个effective_range列,表示该行当前何时“生效”。这样我们就可以查询某个时间戳的世界状态。一个普通的查询如下所示:

-- Get descendent node_ids of a node (var: $3)
SELECT node_id
FROM relationships
WHERE tenant_id = $1::uuid
AND relationship_id = $2::uuid
AND ancestors @> ARRAY[$3]::uuid[]
AND effective_range @> $4::timestamptz

但我找不到要添加的正确索引以保持此查询快速。似乎我需要数组的索引,但是gin索引是否有一种混合方式并在单个索引中?有点像扩展和?ancestorsgisteffective_rangegingistbtree_gistbtree_gin

谢谢!

标签: postgresql

解决方案


推荐阅读