PostgreSQL / PostGIS 9.6 hat meinen zusammengesetzten Index gebrochen

8

In PostgreSQL 9.2 hatte ich kein Problem damit, einen Index zu erstellen, der sowohl einen Geografie-Typ (PostGIS) als auch eine Ganzzahl als zusammengesetzten Index hatte. Aber jetzt (9.6) beschwert es sich über die Erstellung des Index und ich verstehe den Hinweis, den es gibt, nicht:

Die Spalten und Daten werden alle ordnungsgemäß erstellt. Postgres beschwert sich über den Erstellungsindex.

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.

Die Schemadefinition lautet wie folgt:

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

Antworten:

8

Sie müssen eine bestimmte EXTENSIONin Ihrer Datenbank installieren :

CREATE EXTENSION btree_gist ;

Laut PostgreSQL-Dokumentation zu btree_gist :

btree_gist bietet GiST-Indexoperatorklassen, die ein B-Tree-äquivalentes Verhalten für die Datentypen int2, int4, int8, float4, float8, numerisch, Zeitstempel mit Zeitzone, Zeitstempel ohne Zeitzone, Zeit mit Zeitzone, Zeit ohne Zeitzone, Datum implementieren , Intervall, OID, Geld, Char, Varchar, Text, Bytea, Bit, Varbit, Macaddr, Inet und Cidr.

Im Allgemeinen übertreffen diese Operatorklassen die entsprechenden Standard-B-Tree-Indexmethoden nicht und es fehlt ihnen ein Hauptmerkmal des Standard-B-Tree-Codes: die Fähigkeit, die Eindeutigkeit zu erzwingen. Sie bieten jedoch einige andere Funktionen, die mit einem B-Tree-Index nicht verfügbar sind, wie unten beschrieben. Außerdem sind diese Operator Klassen nützlich , wenn ein mehrspaltigen GiST Index benötigt wird , wobei einige Spalten der Datentypen, die nur Wende sind mit GiST aber andere Spalten sind nur einfache Datentypen. Schließlich sind diese Operatorklassen nützlich für GiST-Tests und als Grundlage für die Entwicklung anderer GiST-Operatorklassen.

(Hervorhebung von mir)

btree_gist ist Teil der (aktuellen) Standard-PostgreSQL-Installation, sodass Sie keine Dateien auf Ihrem System installieren müssen.

Nach Installation dieser Erweiterung können Sie all diese Anweisungen auf einem auszuführen sauber von PostgreSQL 9.6.2, ohne Pannen installieren:

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

Und führen Sie alle Ihre CREATEAnweisungen ohne Fehler aus.

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

HINWEIS: Dies wurde laut Kommentar von @Erwin Brandstetter auch für Version 9.2 benötigt. Wenn Sie also einen Dump der Datenbank der Version 9.2 erstellen, sollte die CREATE EXTENSION btree_gist ;Anweisung angezeigt werden.

joanolo
quelle
1
Ja, das gilt auch für S. 9.2.
Erwin Brandstetter
1
Vielen Dank an @joanolo. Als ich über ein benutzerdefiniertes Backup von 9.2 auf 9.6 migrierte, erinnerte es sich aus irgendeinem Grund an die PostGIS-Erweiterungen, nicht jedoch an das GIST. Das Hinzufügen dieses Problems löste das Problem.
Dr.YSG