O PostgreSQL / PostGIS 9.6 quebrou meu índice composto

8

No PostgreSQL 9.2, não tive problemas em criar um índice que tivesse um tipo de geografia (postGIS) e um número inteiro como um índice composto. Mas agora (9.6) queixa-se da criação do índice e não entendo a dica que está fornecendo:

As colunas e os dados são criados corretamente, o Postgres está reclamando do índice de criação.

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.

A definição do esquema é a seguinte:

- 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
fonte

Respostas:

8

Você precisa instalar um específico EXTENSIONem seu banco de dados:

CREATE EXTENSION btree_gist ;

De acordo com a documentação do PostgreSQL em btree_gist :

btree_gist fornece classes de operadores de índice GiST que implementam um comportamento equivalente à árvore B para os tipos de dados int2, int4, int8, float4, float8, numérico, carimbo de data / hora com fuso horário, carimbo de data / hora sem fuso horário, hora com fuso horário, hora sem fuso horário, data , intervalo, oid, dinheiro, char, varchar, texto, bytea, bit, varbit, macaddr, inet e cidr.

Em geral, essas classes de operadores não superam os métodos equivalentes de índice de árvore B padrão e não possuem um recurso importante do código de árvore B padrão: a capacidade de impor exclusividade. No entanto, eles fornecem alguns outros recursos que não estão disponíveis com um índice de árvore B, conforme descrito abaixo. Além disso, essas classes de operadores são úteis quando um índice GiST com várias colunas é necessário , em que algumas das colunas são de tipos de dados indexáveis ​​apenas com o GiST, mas outras são apenas tipos de dados simples. Por fim, essas classes de operadores são úteis para os testes do GiST e como base para o desenvolvimento de outras classes de operadores do GiST.

(ênfase minha)

btree_gist faz parte da instalação padrão (atual) do PostgreSQL; portanto, você não precisa instalar nenhum arquivo no seu sistema.

Após instalar esta extensão, você pode executar todas essas instruções em uma instalação limpa do PostgreSQL 9.6.2, sem falhas:

-- 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 ;

E execute todas as suas CREATEdeclarações sem falhas.

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);

NOTA: Isso também foi necessário para a versão 9.2, de acordo com o comentário de @Erwin Brandstetter. Portanto, provavelmente, se você fizer um despejo do databse da versão 9.2, a CREATE EXTENSION btree_gist ;instrução deverá aparecer.

joanolo
fonte
11
Sim, o mesmo se aplica à página 9.2.
precisa saber é o seguinte
11
Obrigado @joanolo, por algum motivo, quando migrei da 9.2 para a 9.6 por meio de um backup personalizado, ele lembrou as extensões PostGIS, mas não a GIST. Adicionar isso de volta resolveu o problema.
precisa