Элегантный способ заменить одну запись на очень маленькой таблице?

#sql #database #postgresql

Вопрос:

У меня есть небольшая таблица с несколькими записями (~20), которую я использую в качестве кэша для действительно дорогостоящего запроса, возвращающего массив строк. Таблица содержит один текстовый столбец, и она будет обновляться каждые несколько минут. Массив обновляется в памяти, и большую часть времени изменяется только одна из записей.

Я подумываю об использовании транзакции с чем-то вроде:

 INSERT INTO cache(id)
SELECT unnest($1::text[])
ON CONFLICT DO NOTHING

DELETE FROM cache
WHERE id NOT IN (SELECT unnest($1::text[]))
 

но у меня такое чувство, что я мог бы просто удалить все, а затем вставить его снова, так как это такая маленькая таблица. Другим вариантом было бы попытаться объединить запросы с CTE или чем-то еще. Какая лучшая практика?

Спасибо!

Комментарии:

1. Как вы думаете, почему это превзойдет оптимизатора?

2. Поскольку таблица такая крошечная, да, усеките и вставьте.

3. Как правило, вам всегда лучше заменить , а не обновлять , потому что применение дельт к предыдущему состоянию является хрупким, что может привести к отклонению от его надлежащего состояния. При парадигме удаления-замены предыдущее состояние не имеет значения, поэтому у вас есть 100% — ная уверенность в конечном состоянии.