スキーマ全体のPostGISで空間インデックスを作成する


9

SPIT(QGISプラグイン)を使用して多数のシェープファイルをPostGISデータベースにロードしました。これらのレイヤーには、読み込み時に作成される空間インデックスがありませんでした。各レイヤーのクエリを記述せずにスキーマの各レイヤーの空間インデックスを作成する方法があるかどうか疑問に思っています。私は良いPostGISスクリプトライターではないので、どんな助けでも大歓迎です。

ありがとう

回答:


8

ジオメトリ列にインデックスをバッチ作成する場合は、先ほど作成した次のplpgsql関数を試すことができます。

CREATE OR REPLACE FUNCTION BatchIndex(sn text, tn text, cn text) RETURNS void AS $$
DECLARE i_exists integer;
DECLARE idxname text;
BEGIN
  idxname := 'idx_' || tn || '_' || cn;
  select into i_exists count(*) from pg_class where relname = idxname;

  IF i_exists = 0 THEN
    EXECUTE 'CREATE INDEX ' ||idxname || ' ON '
      || sn || '.' || tn
      || ' USING GIST(' || cn || ')';
  END IF;
END;
$$ LANGUAGE plpgsql;

私は私のデータベースで怒ってそれを試していませんが、それは仕事をしているようです。

これを使用するには、次のSELECTようなステートメントを実行します。

select BatchIndex('public', f_table_name, f_geometry_column) from geometry_columns where f_table_schema = 'public';

すべてのジオメトリ列にインデックスを作成するには、次のように使用できます。

select BatchIndex(f_table_schema, f_table_name, f_geometry_column) from geometry_columns;

その後、a VACUUM ANALYZEを実行してすべてを整理します。


どうもありがとうございます。私はこれを実行しましたが、問題があるようです。心に留めておいてください。これは、スクリプト機能が不足しているためかもしれません。しかし、SELECTステートメントを実行すると、次のエラーが発生します。エラー:関数batchindex(不明、文字可変、文字可変)が存在しません1行目:BatchIndex( 'public'、f_table_name、f_geometry_column)を選択...わからないバッチを取得するために何かを追加する場合、またはこれが別のものの単なるプレースホルダーである場合。CREATEクエリは問題なく実行されましたが、インデックスは生成されませんでした。
Ryan Garnett

うーん...そこで何が起こっているのかわかりません。あなたが渡している最初のパラメータが警報ベルを発しているのunknowncharacter varyingはなくタイプであると考えているという事実は、それがどこに問題があるのか​​わかりません。少し考えてみますが、その間、PostgreSQLの達人たちが気に入るでしょうか。:)
MerseyViking

2

ジオメトリのあるビューがある場合、一番上の答えは機能しません。'IF'ステートメントを変更して、ビューにインデックスを作成していないことを確認すると、その問題は解決します。ジオメトリ付きのビューを使用したい場合は、次の行を置き換えます。

IF i_exists = 0

これとともに:

IF i_exists = 0 AND tn IN (SELECT table_name, table_type FROM information_schema.tables WHERE table_type = 'BASE TABLE')

1

テーブルが「構築中」であるとすると、GISTを使用してインデックス付けできます

CREATE INDEX building_gindx ON building USING GIST (geom);

それはあなたが探しているものですか?


Nareshに感謝します。バッチシステムで、スキーマ内のすべてのテーブルのインデックスを作成する方法を探していません。
ライアンガーネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.