Вы действительно ничего не можете сделать, кроме как предвидеть, что, скорее всего, будут делать пользователи.Вы находитесь в хорошем положении, чтобы оптимизатор SQL Server выполнил тяжелую работу за вас (представьте, что вы построите это на хранилище значений ключей!).
Я бы создал индексы для наиболее вероятных столбцов, которые будут отфильтрованыили отсортировано по.Вы должны попытаться отфильтровать эти индексы по ненулевым значениям, что снизит стоимость хранения (при условии, что пользователи не будут фильтровать по нулевым значениям).
Вы также можете попытаться предварительно вычислить общие объединения и агрегаты, используя индексированные представления.Если вы готовы выбросить безумные объемы оперативной памяти при этой проблеме и хотите выполнять медленные записи, вы можете проиндексировать и материализовать адскую базу данных.
Наконец, вы можете разгрузить пользовательские запросы только для чтения.цель доставки журналов или тому подобное.Это позволит изолировать их ужасные запросы.
Для ваших запросов вам необходимо их параметризовать, но вам не нужно кэшировать их во всех случаях.Если ваши запросы, как правило, требуют больших затрат (поэтому время компиляции несущественно), вы захотите запускать их с OPTION RECOMPILE, чтобы SQL Server мог адаптироваться к точным значениям времени выполнения всех параметров.
Вы также должны отслеживать всезапросы и просмотрите их, чтобы найти шаблоны.Ваши пользователи, вероятно, будут постоянно выполнять очень похожие запросы.Индекс для них.
Регулярно запускайте sp_updatestats.
Наконец, я хочу сказать, что не существует очень эффективного решения для этого, потому что если бы SQL Server реализовал их сам, чтобы каждый мог получить выгоду.