У меня есть несколько очень простых запросов, которые иногда выполняются очень медленно.
В таблице view_sites от 10 до 20 строк.
Выполнение EXPLAIN ANALYZE всегда дает время выполнения менее 3 миллисекунд.
Когда запрос запускается автоматически (каждые 10 секунд), время от времени для его выполнения требуется секунда.
Запрос:
INSERT INTO ga.viewed_sites (site_id) VALUES ('gop2')
Таблица:
CREATE TABLE viewed_sites (
site_id character varying(4) NOT NULL,
last_viewed timestamp with time zone DEFAULT now() NOT NULL
);
(Случайный) результат журнала:
2010-05-24 15:47:55 UTC LOG: duration: 1044.632 ms statement: INSERT INTO ga.viewed_sites (site_id) VALUES ('gop2')
Это ужасно расплывчатый вопрос, но что может быть причиной этого? Я предполагаю, что все сводится к процессору, оперативной памяти, жесткому диску или некоторой комбинации вышеперечисленного.
Postgresql 8.3, Ubuntu 8.04
Intel (R) Core (TM) 2 Duo CPU E6750 @ 2,66 ГГц
2 ГиБ RAM
Или стол мог быть заблокирован. Что, кажется, все дано, более вероятно. Postgresql очень консервативен в отношении блокировок, но это может случиться. Ожидание в одну секунду записи HD или CPU кажется крайне маловероятным. И, чтобы сделать вставку, не нужно много плунжера. Проверить таблицу pg_locks
(и pg_stat_activity
чтобы увидеть, что они делают), а функция pg_lock_status()
, или некоторые другие таблицы и функции, относящиеся к статусу блокировки.
Есть ли у таблицы внешний ключ? Если ему нужно проверить ограничение внешнего ключа, он должен выполнить поиск в таблице. Может быть, это замедляет его.
http://wiki.postgresql.org имеет массу советов.