У меня есть таблица с несколькими миллионами строк, из которой мне нужно время от времени выполнять некоторые запросы. Первый запрос обычно будет довольно медленным (около 10 с), а последующие запросы обычно намного быстрее (около 1 с). Через несколько часов медленный / затем быстрый цикл начинается снова.
В своем плане выполнения я проверил, что все необходимые индексы присутствуют и используются надлежащим образом, и я предполагаю, что разница в производительности связана с тем, что индекс фактически находится в памяти для последующих запросов (я прав, или есть другие возможные причины?)
Я также выполняю множество других запросов с использованием индексов, но эти запросы занимают меньше времени и их производительность менее критична, поэтому я обеспокоен тем, что эти индексы фактически выталкивают мой критический индекс из кэша памяти.
Помимо очевидного исправления «добавить больше оперативной памяти», я думал о создании сценариев для пустых запросов, которые выполняются каждый час, чтобы вернуть индекс обратно в память.
Есть ли более элегантный способ сделать это? Как способ намекнуть SQLServer, что, если у него достаточно памяти для хранения в кэше одного индекса, он должен быть таким?
Я знаю, что обычно лучше не связываться с SQLServer по поводу такого рода вещей, но необычная природа моего запроса (выполняется очень редко, но критично ко времени) заставляет меня поверить, что это будет иметь смысл (если это возможно) ,
Мне также любопытно узнать, есть ли способ узнать, какие индексы кэшируются в памяти в данный момент?
Попробуйте использовать
KEEPPLAN
иKEEPPLAN FIXED
запросить подсказки .KEEPPLAN заставляет оптимизатор запросов ослабить предполагаемый порог перекомпиляции для запроса.
KEEPFIXED PLAN заставляет оптимизатор запросов не перекомпилировать запрос из-за изменений в статистике. Задание KEEPFIXED PLAN гарантирует, что запрос будет перекомпилирован только в том случае, если схема базовых таблиц изменена или если sp_recompile выполняется для этих таблиц.
источник