yacc> А я говорил, применительно к скомпилированному плану, про DC - разумеется мой любимый подход.
Допустим у нас есть план запроса сохраненный в виде исполняемого кода. Он не изменен все время жизни приложения. Но тогда он будет оптимален только для того набора данных в БД на котором он был получен. И есть вероятность потерять производительность на других данных. Чтобы иметь предсказуемое время исполнения такой план не должен использовать статистику, а строится только на структуре БД. Это мне живо напоминает ORM которые игнорируют возможности СУБД и используют их чуть ли не как KV store с транзакциями. Сохраненный план безусловно оптимизирует время выполнения коротких тривиальных запросов, когда время исполнения близко к времени построения плана. Но только в случае если в СУБД планы не кэшируется. А они кэшируется во многих СУБД.
Более сложные запросы, в которых наличие статистики важно для построения оптимального плана, скорее всего будет выполняться медленнее. В таких запросах время на построение плана обычно многократно меньше времени выполнения, часто на порядки. Где выигрыш тут?
yacc> Тогда приложение можно сделать компактным, но оно изолировано от структуры БД - ему дают что дают.
Так сохраненный запрос или abstract db layer? Abstract db layer вполне почтенный подход, с ним главное не наплодить абстракций больше меры.
yacc> Код приложения был очень компактный.
Хранение конфигурации в db это уже третье. Это хорошо когда нужно несколько однотипных приложений, а плохо то что в BD не дает надежного версионирования что часто создает дикую головную боль в troubleshooting. Если у меня приложение build XYZ то я знаю с чем имею дело, а если в базе написано что она версии ZYX то есть ненулевая вероятность что, на самом деле, она не то чем претворяется.