Я экспериментирую с сохранением значений, подобных следующим в поле Postgres jsonb
в Postgres 9.4:
[{"event_slug":"test_1","start_time":"2014-10-08","end_time":"2014-10-12"},
{"event_slug":"test_2","start_time":"2013-06-24","end_time":"2013-07-02"},
{"event_slug":"test_3","start_time":"2014-03-26","end_time":"2014-03-30"}]
Я выполняю запросы вроде:
SELECT * FROM locations
WHERE EXISTS (
SELECT 1 FROM jsonb_array_elements(events) AS e
WHERE (
e->>'event_slug' = 'test_1' AND
(
e->>'start_time' >= '2014-10-30 14:04:06 -0400' OR
e->>'end_time' >= '2014-10-30 14:04:06 -0400'
)
)
)
Как мне создать индекс для этих данных для запросов, подобных описанным выше? Означает ли это разумный дизайн для нескольких миллионов строк, каждый из которых содержит ~ 10 событий в этом столбце?
Стоит отметить, что кажется, что я все еще получаю последовательные сканирования:
CREATE INDEX events_gin_idx ON some_table USING GIN (events);
который я предполагаю, потому что первое, что я делаю в запросе, - это преобразование данных в элементы массива json.