Есть простая таблица:
CREATE TABLE public.notices (
id TEXT NOT NULL,
json TEXT,
CONSTRAINT notices_idx PRIMARY KEY(id)
)
WITH (oids = false);
В json может быть
длиннющий текст.
Перед добавлением записей проверяю их наличие в таблице, этот этап прошёл три стадии развития:
- Проверка по одному:
select * from notices where id = '123' limit 1);
- Проверка по одному:
select exists(select 1 from notices where id = '123');
- Проверка всем скопом:
(SELECT id FROM notices WHERE id='123' LIMIT 1) UNION ALL (SELECT id FROM notices WHERE id='234' LIMIT 1) UNION ALL ...
Последний способ дал существенное ускорение, но количество записей растёт, количество id в запросе большое, так что скорость проверки пачки в 50 тыс. id для базы размером ~1 млн. записей составляет от 20 до 60 секунд на текущей машине.
Хотелось бы ускорить проверку до минимума. Как можно оптимизировать?
Поскольку поле json может быть очень длинным, виню в том числе и его. Если я выделю id в отдельную таблицу, есть ли ускорение?