2013-11-12 4 views
4

В команде postgres 9.2 (CentOS) команда TRUNCATE TABLE время от времени занимала очень много времени. Один раз потребовалось более 1,5 часов, чтобы урезать таблицу со 100 КБ-записями, даже дольше в других случаях. Эта проблема также возникла, когда я использовал pgAdmin для обрезания таблицы. Какова возможная причина? и как улучшить производительность усечения?postgres truncate is slow

Существует 16GB памяти на сервере и shared_buffers = 1536MB

+4

Это, вероятно, означает, что процесс TRUNCATE ожидал получить блокировку; и некоторым другим процессам потребовалось много времени, чтобы выпустить их блокировку. Но этот вопрос здесь не по теме. – Flimzy

ответ

9

TRUNCATE должен смывать shared_buffers для таблицы усекается, и он должен разъединить старый файл, который может быть медленным в файловых системах с медленным удалением подобный ext3.

1,5 часа довольно экстремальные, хотя мы обычно говорим в секундах. Очень вероятно, что у вас есть другие сеансы, содержащие блокировки на столе, которые предотвращают продолжение TRUNCATE. См. pg_catalog.pg_locks и pg_catalog.pg_stat_activity.

The PostgreSQL wiki article on lock monitoring должен быть полезен.

Смотрите также: Postgresql Truncation speed

0

Попробуйте отключить все другие подключения к базе данных. Мне потребовалось навсегда урезать 58000 записей.

После того, как я отключил базу данных postgres от PyCharm DB Navigator, dev-сервер и т. Д. Выполнили 118 мс.