Создать пространственный индекс в 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чтобы привести в порядок все.

MerseyViking
источник
Спасибо большое, это выглядит великолепно. Я запустил это, но, кажется, есть проблема, это может быть из-за моей нехватки сценариев. Но когда я запускаю операторы SELECT, я получаю следующую ошибку: ОШИБКА: функция batchindex (неизвестно, меняется символ, меняется символ) LINE 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
источник
Спасибо Naresh, нет, я ищу способ создания индексов для всех таблиц в схеме, в пакетной системе.
Райан Гарнетт