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);
Dr.YSG
источник

Ответы:

8

Вам необходимо установить конкретное EXTENSIONв вашей базе данных:

CREATE EXTENSION btree_gist ;

Согласно документации PostgreSQL на btree_gist :

btree_gist предоставляет классы операторов индекса GiST, которые реализуют эквивалентное поведение B-дерева для типов данных int2, int4, int8, float4, float8, числовые, временная метка с часовым поясом, временная метка без часового пояса, время с часовым поясом, время без часового пояса, дата , интервал, oid, деньги, char, varchar, текст, bytea, бит, 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);

ПРИМЕЧАНИЕ. Это также было необходимо для версии 9.2, согласно комментарию @Erwin Brandstetter. Так что, скорее всего, если вы сделаете дамп базы данных версии 9.2, CREATE EXTENSION btree_gist ;должен появиться оператор.

joanolo
источник
1
Да, то же самое относится к стр. 9.2.
Эрвин Брандштеттер
1
Спасибо @joanolo, По какой-то причине, когда я перешел с 9.2 на 9.6 через пользовательскую резервную копию, он запомнил расширения PostGIS, но не GIST. Добавление этого обратно решило проблему.
Dr.YSG