#postgresql #spatial #postgis #spatial-index
#postgresql #пространственный #postgis #пространственный индекс
Вопрос:
У меня есть большой объем пространственных данных, которые мне нужно проанализировать и использовать в приложении. Исходные данные представлены в формате WKT, и я оборачиваю их в инструкции INSERT SQL для загрузки данных.
INSERT INTO sp_table ( ID_Info, "shape") VALUES ('California', , ST_GeomFromText('POLYGON((49153 4168, 49154 4168, 49155 4168, 49155 4167, 49153 4168))'));
Однако этот подход занимает слишком много времени, а данные большие (10 миллионов строк).
Итак, есть ли какой-либо другой способ загрузить большое количество пространственных данных?
Приветствуются любые хаки и хитрости для ускорения.
Ответ №1:
Вставьте свой текстовый файл в таблицу (с соответствующими столбцами) с помощью COPY
Добавьте ПОСЛЕДОВАТЕЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ к этой таблице, если в ней его нет
ВАКУУМ
Создайте по одному процессу на процессор, который выполняет это :
INSERT INTO sp_table ( ID_Info, "shape")
SELECT state_name, ST_GeomFromText( geom_as_text )
FROM temp_table
WHERE id % numbre_of_cpus = x
Используйте разное значение «x» для каждого процесса, чтобы обрабатывалась вся таблица. Это позволит каждому ядру работать с медленной функцией ST_GeomFromText.
Создайте индекс GIST после вставки.
Ответ №2:
Здесь вы можете найти несколько общих советов по производительности. Возможно, у вас включено свойство fsync, и каждая INSERT
команда вынуждена физически записываться на жесткий диск, вот почему это занимает так много времени.
Не рекомендуется отключать fsync (особенно в производственных средах), поскольку это позволяет безопасно восстанавливать данные после неожиданного сбоя ОС. Согласно документу:
Таким образом, рекомендуется отключать fsync только в том случае, если вы можете легко воссоздать всю свою базу данных из внешних данных.
Комментарии:
1. КОПИРОВАНИЕ выполняется быстрее, и все советы хороши. Отключение fsync может привести к повреждению.