Как улучшить время выполнения запроса UPDATE в Postgresql? - PullRequest
3 голосов
/ 17 августа 2010

У меня следующий запрос выполняется в течение 3 часов +:

UPDATE eop_201007
set coord_x = gi.x_etrs89, coord_y = gi.x_etrs89,gr_type = 4
from eop_201007 as eop, geoindex201001 as gi
where eop.cp7=gi.cp7 AND eop.gr_type=0;

eop таблица имеет 300k + записей, а gi таблица 100k +.

Поле cp7 проиндексировано в обеих таблицах, и для его заполнения требуется слишком много времени.

Я делаю это неправильно? Как я могу улучшить это?

Ответы [ 2 ]

1 голос
/ 18 августа 2010

Вам не нужно "eop_201007 as eop" в вашем ОТ.Будет работать следующее:

UPDATE eop_201007
set coord_x = gi.x_etrs89, coord_y = gi.x_etrs89,gr_type = 4
from geoindex201001 as gi
where eop_201007.cp7=gi.cp7 AND eop_201007.gr_type=0;

Я думаю, что дополнительный eop вызывает перекрестное объединение (в основном это перекрестное произведение двух таблиц, которое ОГРОМНО), поскольку оно не ограничено исходной таблицей eop, котораяуже «автоматически» в списке FROM

Если это не исправит ситуацию, вот некоторые другие мысли:

Возможно, вы сначала захотите провести вакуумный анализ, если у вас нет,Убедитесь, что у вас есть все настройки памяти в postgresql.conf.Рабочая память, общие буферы и т. Д. Могут иметь огромное значение.

Если это одноразовая, а не ночная работа, вы должны отключить fsync.Кроме того, убедитесь, что (если вы выключите fsync), у вас не настроено слишком много сегментов контрольных точек (24 или около того), иначе вы загрязните кэш диска.

Как сказал @Frank Heikens, выследует посмотреть на объяснение.Также отметьте EXPLAIN ANALYZE (если ваш запрос когда-либо завершается).

1 голос
/ 17 августа 2010

Отметьте эту тему и используйте EXPLAIN, чтобы увидеть, что происходит.Может помочь и лучшая конфигурация для WAL , просто проверьте использование памяти и скорость записи во время обновления.

Редактирование: и убедитесь, что никакие другие транзакции не блокируют вашу таблицу, вам придется ждать вечно...

SELECT 
    relname, 
    * 
FROM 
    pg_locks
        JOIN pg_class ON pg_locks.relation  = pg_class.oid
...