web-dev-qa-db-ja.com

PostgreSQL / PostGIS 9.6で複合インデックスが壊れました

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
Dr.YSG

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

CREATE EXTENSION btree_Gist ;

PostgreSQLのbtree_Gistに関するドキュメント によると:

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のcleanインストールでこれらのすべての手順を実行できます。

-- 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のデータベースのdumpを作成すると、CREATE EXTENSION btree_Gist ;ステートメントが表示されます。

8
joanolo