可索引运算符

来自 PostgreSQL Wiki
跳转到导航跳转到搜索

查找可与索引一起使用的运算符

管理片段

可索引运算符

适用于 PostgreSQL

>=8.1

SQL

依赖于


当使用 GiST 或 GIN 索引时,可能无法立即清楚地知道哪些类型的查询可以使用特定索引。通常,可索引查询具有以下形式的 WHERE 子句:"indexed_column indexable_operator constant"。对于常规的 btree 和哈希索引,可索引运算符仅为 =,<,<=,>,>=。对于 GiST 或 GIN 索引,可索引运算符可能是完全不同的。以下查询可以帮助您找出哪些运算符可以与任何特定现有索引一起使用。

适用于 Postgres 8.3 及更高版本

SELECT
  pg_get_indexdef(ss.indexrelid, (ss.iopc).n, true) AS index_col,
  amop.amopopr::regoperator AS indexable_operator
FROM pg_opclass opc, pg_amop amop,
  (SELECT indexrelid, information_schema._pg_expandarray(indclass) AS iopc
   FROM pg_index
   WHERE indexrelid = 'INDEXNAME'::regclass) ss
WHERE amop.amopfamily = opc.opcfamily and opc.oid = (ss.iopc).x
ORDER BY (ss.iopc).n, indexable_operator;

(将 INDEXNAME 替换为您感兴趣的索引的名称。)

适用于 Postgres 8.1 和 8.2

SELECT
  pg_get_indexdef(ss.indexrelid, (ss.iopc).n, true) AS index_col,
  amop.amopopr::regoperator AS indexable_operator
FROM pg_amop amop,
  (SELECT indexrelid, information_schema._pg_expandarray(indclass) AS iopc
   FROM pg_index
   WHERE indexrelid = 'INDEXNAME'::regclass) ss
WHERE amop.amopclaid = (ss.iopc).x
ORDER BY (ss.iopc).n, indexable_operator;

示例输出

给定

create table t1 (f1 polygon);
create index i1 on t1 using gist(f1);

索引 i1 的输出将如下所示

 index_col |  indexable_operator  
-----------+----------------------
 f1        | <<(polygon,polygon)
 f1        | &<(polygon,polygon)
 f1        | &>(polygon,polygon)
 f1        | >>(polygon,polygon)
 f1        | <@(polygon,polygon)
 f1        | @>(polygon,polygon)
 f1        | ~=(polygon,polygon)
 f1        | &&(polygon,polygon)
 f1        | <<|(polygon,polygon)
 f1        | &<|(polygon,polygon)
 f1        | |&>(polygon,polygon)
 f1        | |>>(polygon,polygon)
 f1        | @(polygon,polygon)
 f1        | ~(polygon,polygon)
(14 rows)