Я разрабатываю систему, в которой будут храниться записи, содержащие время начала и окончания.Например:
CREATE TABLE test (
id bigserial PRIMARY KEY,
ts_start timestamp NOT NULL,
ts_end timestamp NOT NULL,
foo bar NOT NULL,
...
);
Теперь я хочу выполнить запросы для этого, чтобы найти все строки, которые перекрываются с определенной отметкой времени.Это может привести к выражению where, например:
WHERE ts_start <= '2006-4-6 12:34:56' AND ts_end > '2006-4-6 12:34:56'
Я проверил это с огромным количеством сгенерированных тестовых данных, и производительность довольно плохая.Я протестировал его с индексом ts_start и другим индексом ts_end, а также с индексом из нескольких столбцов ts_start и ts_end.Последний дал лучший результат, но он все еще далек от оптимального.
Проблема в том, что postgresql не знает, что ts_end гарантированно больше ts_start, поэтому он использует план, способный находить строки, где ts_end меньше ts_start.
Любые предложения, как решить эту проблему?
Редактировать: Для людей, имеющих эту проблему тоже, если вы можете подождать немного дольше, тогда PostgreSQL 9.2 имеет идеальное решение: типы диапазонов .9.2 находится в бета-версии, а окончательный выпуск, скорее всего, будет в конце 2012 года.