SPIT(QGISプラグイン)を使用して多数のシェープファイルをPostGISデータベースにロードしました。これらのレイヤーには、読み込み時に作成される空間インデックスがありませんでした。各レイヤーのクエリを記述せずにスキーマの各レイヤーの空間インデックスを作成する方法があるかどうか疑問に思っています。私は良いPostGISスクリプトライターではないので、どんな助けでも大歓迎です。
ありがとう
SPIT(QGISプラグイン)を使用して多数のシェープファイルをPostGISデータベースにロードしました。これらのレイヤーには、読み込み時に作成される空間インデックスがありませんでした。各レイヤーのクエリを記述せずにスキーマの各レイヤーの空間インデックスを作成する方法があるかどうか疑問に思っています。私は良いPostGISスクリプトライターではないので、どんな助けでも大歓迎です。
ありがとう
回答:
ジオメトリ列にインデックスをバッチ作成する場合は、先ほど作成した次の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
を実行してすべてを整理します。
unknown
でcharacter varying
はなくタイプであると考えているという事実は、それがどこに問題があるのかわかりません。少し考えてみますが、その間、PostgreSQLの達人たちが気に入るでしょうか。:)
ジオメトリのあるビューがある場合、一番上の答えは機能しません。'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')