Створіть просторовий індекс у 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;

Після цього запустіть, VACUUM ANALYZEщоб привести в порядок все.


Дякую тобі, це виглядає чудово. Я це запустив, але, мабуть, проблема є, зауважте, це могло бути через мою відсутність вміння сценарію. Але коли я запускаю оператори SELECT, я отримую таку помилку: ПОМИЛКА: функція batchindex (невідомо, зміна символів, зміна символів) не існує ЛІНІЯ 1: виберіть BatchIndex ('public', f_table_name, f_geometry_column) ... Я не впевнений якщо я хочу додати що-небудь для отримання партії, або якщо це просто власник місця для чогось іншого. Запит CREATE пройшов без проблеми, але не було створено індексів.
Райан Гарнетт

Хм ... я не впевнений, що тоді там відбувається. Той факт, що він вважає, що перший параметр, який ти передаєш, має тип, unknownа не character 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, ні, я шукаю спосіб створити індекси для всіх таблиць на схемі, в пакетній системі.
Райан Гарнетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.