Редко, но крайне метко протухают индексы. В первый раз - на 9.1, недавно совсем на 9.2.
Выявляется тем, что неожиданно перестает работать запрос по индексированному полю.
Например есть две таблицы A (id, name) и B (id, name, a_id). B ссылается на A по id, поля name в обеих таблицах совпадают, по полю name в таблице A есть индекс (уникальный по Btree).
A 1, 'petya' B 11, 'petya', 1 12, 'petya', 1
И в какой-то момент запрос [select id from A where name = 'petya'] перестает отдавать результат для значений name, существующих в таблице.
Проверяем, запросив содержимое B по name ('petya'). Получаем строку с идентификатором строки из A (1). По этому идентификатору запрашиваем A и получаем строку с тем значением в name, по которому делали запрос, вернувший пустой результат.
Удаляем индекс по name из A и чудесным образом запрос [select id from A where name = 'petya'] начинает отдавать данные. Пересоздаем индекс и все работает дальше.
Известна ли кому причина?
Если на таблицах выполняется
Если на таблицах выполняется большое количество операций вставки/замены/удаления, то процесс сбора статистики autovacuum может не успевать актуально обновлять статистику по этим таблицам. В этом случае рекомендуется самом с определённой периодичностью запускать VACUUM ANALYZE или VACUUM FULL
На первом сбое действительно
На первом сбое действительно была таблица большая и активно обновляемая.
Но на последнем сбое упал индекс на таблице, куда в сутки попадает около двух сотен строк, а обновляется сотни три - она практически не меняется по сравнению с остальными.
VACUUM ANALYZE пускается раз в сутки.
Попробуйте запускать каждый
Попробуйте запускать каждый час.