PostgreSQL / PostGIS 9.6 a cassé mon index composé

8

Dans PostgreSQL 9.2, je n'ai eu aucun problème à créer un index qui avait à la fois un type géographique (postGIS) et un entier comme index composé. Mais maintenant (9.6), il se plaint de la création de l'index et je ne comprends pas l'astuce qu'il fournit:

Les colonnes et les données sont toutes créées correctement, Postgres se plaint de l'index de création.

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 définition du schéma est la suivante:

- 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
la source

Réponses:

8

Vous devez installer un spécifique EXTENSIONdans votre base de données:

CREATE EXTENSION btree_gist ;

Selon la documentation PostgreSQL sur btree_gist :

btree_gist fournit des classes d'opérateurs d'index GiST qui implémentent un comportement équivalent à l'arborescence B pour les types de données int2, int4, int8, float4, float8, numérique, horodatage avec fuseau horaire, horodatage sans fuseau horaire, heure avec fuseau horaire, heure sans fuseau horaire, date , interval, oid, money, char, varchar, text, bytea, bit, varbit, macaddr, inet et cidr.

En général, ces classes d'opérateurs ne surpasseront pas les méthodes d'indexation standard de l'arbre B standard, et il leur manque une caractéristique principale du code standard de l'arbre B: la capacité à imposer l'unicité. Cependant, ils fournissent d'autres fonctionnalités qui ne sont pas disponibles avec un index B-tree, comme décrit ci-dessous. En outre, ces classes d'opérateurs sont utiles lorsqu'un index GiST à plusieurs colonnes est nécessaire , dans lequel certaines des colonnes sont de types de données qui ne sont indexables qu'avec GiST mais d'autres colonnes ne sont que de simples types de données. Enfin, ces classes d'opérateurs sont utiles pour les tests GiST et comme base pour développer d'autres classes d'opérateurs GiST.

(c'est moi qui souligne)

btree_gist fait partie de l'installation PostgreSQL standard (actuelle), vous n'avez donc pas besoin d'installer de fichiers dans votre système.

Après avoir installé cette extension, vous pouvez exécuter toutes ces instructions sur un propre INSTALL PostgreSQL 9.6.2, sans anicroche:

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

Et exécutez toutes vos CREATEdéclarations sans problème.

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

REMARQUE: cela était également nécessaire pour la version 9.2, selon les commentaires de @Erwin Brandstetter. Donc, très probablement, si vous effectuez un vidage de la base de données de la version 9.2, l' CREATE EXTENSION btree_gist ;instruction devrait apparaître.

joanolo
la source
1
Oui, il en va de même pour la page 9.2.
Erwin Brandstetter
1
Merci @joanolo, Pour une raison quelconque, lorsque j'ai migré de 9.2 à 9.6 via une sauvegarde personnalisée, il se souvenait des extensions PostGIS mais pas du GIST. L'ajout de cela a résolu le problème.
Dr.YSG