У меня есть большая таблица (40+ миллионов записей) со следующей структурой:
CREATE TABLE collected_data(
id TEXT NOT NULL,
status TEXT NOT NULL,
PRIMARY KEY(id, status),
blob JSONB,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
Мне нужно получить все (или, по крайней мере, 100000) записей, которые имеют updated_at
старше 24 часов с определенным статусом и имеет большой двоичный объект, который не является нулевым.
Таким образом, запрос становится:
SELECT
id
FROM
collected_data
WHERE
status = 'waiting'
AND blob IS NOT NULL
AND updated_at < NOW() - '24 hours'::interval
LIMIT 100000;
В результате получается план выполнения примерно такой: 1011 *
Это почти всегда приводит к полному сканированию таблицы, что означает, что некоторые запросы выполняются очень медленно.
Я пытался создать индексы, такие как CREATE INDEX idx_special ON collected_data(status, updated_at);
, но это не помогло.
Можно ли как-нибудь ускорить этот запрос?