Gorily
@Gorily

PostgreSQL, как ускорить проверку наличия уникального значения в столбце?

Есть простая таблица:
CREATE TABLE public.notices (
  id TEXT NOT NULL,
  json TEXT,
  CONSTRAINT notices_idx PRIMARY KEY(id)
) 
WITH (oids = false);

В json может быть длиннющий текст.
Перед добавлением записей проверяю их наличие в таблице, этот этап прошёл три стадии развития:
  1. Проверка по одному: select * from notices where id = '123' limit 1);
  2. Проверка по одному:
    select exists(select 1 from notices where id = '123');

  3. Проверка всем скопом:
    (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 в отдельную таблицу, есть ли ускорение?
  • Вопрос задан
  • 4674 просмотра
Решения вопроса 1
Vityarik
@Vityarik
Для поля id есть индекс, это первичный ключ?

3 проверка - по моему ужас. Уж лучше так:
SELECT id FROM notices WHERE id='123' OR id='234'...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
iximiuz
@iximiuz
У вас доступ фактически по ключу, храните в key-value хранилище просто, например в Redis.
Ответ написан
onyxmaster
@onyxmaster
Программист, ненастоящий сисадмин
Вероятно в большинстве случаев объекты уже есть, так что может быть лучше получать отсутствующие?
select "id" from "notices" where "id" not in ('1', '2', ...)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы