PostgreSQL / PostGIS 9.6打破了我的复合索引


8

在PostgreSQL 9.2中,我创建一个具有地理(postGIS)类型和整数作为复合索引的索引没有问题。但是现在(9.6)它抱怨创建索引,我不明白它提供的提示:

列和数据均已正确创建,Postgres抱怨创建索引。

ERROR: data type integer has no default operator class for access method "gist" 
HINT: You must specify an operator class for the index 
      or define a default operator class for the data type. 
********** Error**********  
ERROR: data type integer has no default operator class for access method "gist" 
SQL state: 42704 
Hint: You must specify an operator class for the index 
      or define a default operator class for the data type.

模式定义如下:

- Table: portal.inventory

-- DROP TABLE portal.inventory;

CREATE TABLE portal.inventory
(
  type character varying,
  pid integer,
  size bigint,
  date timestamp without time zone,
  path character varying,
  outline geography(Polygon,4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE portal.inventory
  OWNER TO postgres;

-- Index: portal.inventory_compound_idx

-- DROP INDEX portal.inventory_compound_idx;

CREATE INDEX inventory_compound_idx
  ON portal.inventory
  USING gist
  (outline, pid);

-- Index: portal.inventory_icompound_idx

-- DROP INDEX portal.inventory_icompound_idx;

CREATE INDEX inventory_icompound_idx
  ON portal.inventory
  USING gist
  (pid, outline);

Answers:


8

您需要EXTENSION在数据库中安装特定的:

CREATE EXTENSION btree_gist ;

根据PostgreSQL关于btree_gist的文档

btree_gist提供了GiST索引运算符类,该类针对数据类型int2,int4,int8,float4,float8,数字,带时区的时间戳,带时区的时间戳,带时区的时间,带时区的时间,日期的B树等效行为,时间间隔,oid,金钱,char,varchar,文本,bytea,bit,varbit,macaddr,inet和cidr。

通常,这些运算符类不会优于等效的标准B树索引方法,并且它们缺少标准B树代码的一个主要功能:强制执行唯一性的能力。但是,它们提供了B树索引无法提供的一些其他功能,如下所述。同样,当需要多列GiST索引时这些运算符类也很有用,其中某些列的数据类型只能用GiST索引,而其他列只是简单的数据类型。最后,这些运算符类对于GiST测试非常有用,并且可以作为开发其他GiST运算符类的基础。

(强调我的)

btree_gist 是标准(当前)PostgreSQL安装的一部分,因此,您实际上不需要在系统中安装任何文件。

安装该扩展后,您可以执行所有这些指令在一个干净的安装PostgreSQL 9.6.2,无故障:

-- If there is not there, create extension PostGis as well
CREATE EXTENSION IF NOT EXISTS postgis ;

-- Create Schema `portal`
CREATE SCHEMA IF NOT EXISTS portal ;

CREATE毫无毛刺地执行所有语句。

CREATE TABLE portal.inventory
(
  type character varying,
  pid integer,
  size bigint,
  date timestamp without time zone,
  path character varying,
  outline geography(Polygon,4326)
);

CREATE INDEX inventory_compound_idx
  ON portal.inventory
  USING gist
  (outline, pid);

CREATE INDEX inventory_icompound_idx
  ON portal.inventory
  USING gist
  (pid, outline);

注意:根据@Erwin Brandstetter的评论,版本9.2也需要此功能。因此,最有可能的是,如果您转储 9.2版数据库的转储CREATE EXTENSION btree_gist ;则应显示该语句。


1
是的,第9.2页也是如此。
Erwin Brandstetter

1
谢谢@joanolo,由于某种原因,当我通过自定义备份从9.2迁移到9.6时,它记住了PostGIS扩展名,但记住了GIST。添加回去解决了这个问题。
Dr.YSG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.