Как я могу создать эффективный индекс для быстрого извлечения данных только за последний день? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть таблица со 118-ю строками данных, которые я пока не могу разделить.Я хотел бы иметь возможность быстро получить данные за последние 24 часа.Это в формате:

created_at | page_id
timestampz     text

Что-то вроде этого лучше всего?(Получая ошибку об IMMUTABLE, хотя)

CREATE INDEX my_table_last_day
ON my_table (created_at)
WHERE date(created_at) = date(current_timestamp) - INTERVAL '1 day'

Будет ли это эффективно обновляться, если я получаю ~ 200k новых строк в день?

1 Ответ

0 голосов
/ 12 февраля 2019

Необходимо иметь индекс только на created_at::date.Квалификация where не является необходимой и будет делать странные вещи при изменении current_timestamp.Индекс B-дерева Postgres по умолчанию может обрабатывать запросы на равенство и диапазон.

Обязательно используйте дополнительные скобки.

test=> create index my_table_created_at_date on my_table((created_at::date));
CREATE INDEX

test=> analyze my_table;                                                    
ANALYZE

test=> explain select * from my_table WHERE date(created_at) = date(current_timestamp) - INTERVAL '1 day';
                                       QUERY PLAN                                        
-----------------------------------------------------------------------------------------
 Index Scan using my_table_created_at_date on my_table  (cost=0.29..8.43 rows=2 width=8)
   Index Cond: (date(created_at) = (date(CURRENT_TIMESTAMP) - '1 day'::interval))

Также обязательно указывайте индекспросто created_at, чтобы охватить другие не датированные запросы.

test=> create index my_table_created_at on my_table(created_at);
CREATE INDEX

test=> analyze my_table ;
ANALYZE

test=> explain select * from my_table WHERE created_at between (current_timestamp - INTERVAL '1 day') and current_timestamp;
                                                  QUERY PLAN                                                   
---------------------------------------------------------------------------------------------------------------
 Index Only Scan using my_table_created_at on my_table  (cost=0.29..4.39 rows=5 width=8)
   Index Cond: ((created_at >= (CURRENT_TIMESTAMP - '1 day'::interval)) AND (created_at <= CURRENT_TIMESTAMP))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...