PostgreSQL / PostGIS 9.6 ha rotto il mio indice composto


8

In PostgreSQL 9.2 non ho avuto problemi a creare un indice che avesse sia un tipo geografico (postGIS) sia un intero come indice composto. Ma ora (9.6) si lamenta della creazione dell'indice e non capisco il suggerimento che sta fornendo:

Le colonne e i dati sono tutti creati correttamente, Postgres si lamenta dell'indice di creazione.

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.

La definizione dello schema è la seguente:

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

Risposte:


8

Devi installare uno specifico EXTENSIONnel tuo database:

CREATE EXTENSION btree_gist ;

Secondo la documentazione di PostgreSQL su btree_gist :

btree_gist fornisce classi di operatori di indice GiST che implementano il comportamento equivalente dell'albero B per i tipi di dati int2, int4, int8, float4, float8, numerico, data / ora con fuso orario, data / ora senza fuso orario, ora con fuso orario, ora senza fuso orario, data , intervallo, oid, denaro, carattere, varchar, testo, bytea, bit, varbit, macaddr, inet e cidr.

In generale, queste classi di operatori non supereranno i metodi di indice B-tree standard equivalenti e mancano di una delle caratteristiche principali del codice B-tree standard: la capacità di applicare l'unicità. Tuttavia, forniscono alcune altre funzionalità che non sono disponibili con un indice B-tree, come descritto di seguito. Inoltre, queste classi di operatori sono utili quando è necessario un indice GiST a più colonne, in cui alcune colonne sono di tipi di dati che sono indicizzabili solo con GiST ma altre colonne sono solo tipi di dati semplici. Infine, queste classi di operatori sono utili per i test GiST e come base per lo sviluppo di altre classi di operatori GiST.

(enfatizzare il mio)

btree_gist fa parte dell'installazione PostgreSQL standard (attuale), quindi non è necessario installare alcun file nel sistema.

Dopo aver installato questa estensione, è possibile eseguire tutte queste istruzioni su un'installazione pulita di PostgreSQL 9.6.2, senza problemi:

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

Ed esegui tutte le tue CREATEdichiarazioni senza problemi.

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: questo era necessario anche per la versione 9.2, secondo il commento di @Erwin Brandstetter. Quindi, molto probabilmente, se fai un dump del databse versione 9.2, CREATE EXTENSION btree_gist ;dovrebbe apparire la dichiarazione.


1
Sì, lo stesso vale per pag 9.2.
Erwin Brandstetter,

1
Grazie @joanolo, per qualche motivo, quando sono passato da 9.2 a 9.6 tramite un backup personalizzato, mi sono ricordato delle estensioni PostGIS ma non di GIST. L'aggiunta di nuovo in risolto il problema.
Dr.YSG,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.