#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% — ная уверенность в конечном состоянии.