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

回答:


8

EXTENSIONデータベースに特定のものをインストールする必要があります。

CREATE EXTENSION btree_gist ;

btree_gistのPostgreSQLドキュメントによると:

btree_gistは、データ型int2、int4、int8、float4、float8、数値、タイムゾーン付きタイムスタンプ、タイムゾーンなしタイムスタンプ、タイムゾーンなしタイム、タイムゾーンなしタイム、日付のBツリー同等の動作を実装するGiSTインデックス演算子クラスを提供します、interval、oid、money、char、varchar、text、bytea、bit、varbit、macaddr、inet、cidr。

一般に、これらの演算子クラスは同等の標準Bツリーインデックスメソッドよりも性能がよくなく、標準Bツリーコードの主要な機能の1つである一意性を強制する機能が欠けています。ただし、以下で説明するように、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);

注:@Erwin Brandstetterのコメントによると、これはバージョン9.2にも必要でした。したがって、おそらく、バージョン9.2のデータベースのダンプを作成すると、CREATE EXTENSION btree_gist ;ステートメントが表示されます。


1
はい、同じことがpg 9.2にも当てはまります。
Erwin Brandstetter 2017

1
@joanoloに感謝します。何らかの理由で、カスタムバックアップを介して9.2から9.6に移行したところ、PostGIS拡張は記憶されていましたが、GISTは記憶されていませんでした。これを元に戻すと問題は解決しました。
Dr.YSG 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.