Когда вы выполняете запрос, данные считываются в память блоками. Эти блоки остаются в памяти, но они стареют. Это означает, что блоки помечены с последним доступом, и когда Sql Server требует еще один блок для нового запроса и кэш-память заполнена, наименее использованный блок (самый старый) удаляется из памяти. (В большинстве случаев - блоки сканирования полных таблиц мгновенно стареют, чтобы предотвратить полное сканирование таблиц, переполнение памяти и перегрузка сервера).
То, что здесь происходит, заключается в том, что блоки данных в памяти из первого запроса еще не выгружены из памяти, поэтому их можно использовать для второго запроса, что означает отсутствие доступа к диску и повышение производительности.
Итак, что на самом деле задает ваш вопрос: «Могу ли я получить нужные блоки данных в память, не считывая их в память (фактически выполняя запрос)?». Ответ отрицательный, если только вы не хотите кэшировать целые таблицы и постоянно размещать их в памяти, что, исходя из времени запроса (и, следовательно, размера данных), который вы описываете, вероятно, не является хорошей идеей.
Ваш лучший выбор для повышения производительности - это посмотреть на ваши планы выполнения запросов и посмотреть, может ли изменение ваших индексов дать лучший результат. Здесь есть две основные области, которые могут улучшить производительность:
- создание индекса, в котором запрос мог бы использовать индекс, чтобы избежать неэффективных запросов и полного сканирования таблицы
- добавление дополнительных столбцов к индексу, чтобы избежать повторного чтения с диска. Например, у вас есть запрос, который возвращает столбцы A и B с предложением where для A и C, и у вас есть индекс для столбца A. Ваш запрос будет использовать индекс для столбца A, для которого требуется одно чтение с диска, но затем потребуется второй диск нажмите, чтобы получить столбцы B и C. Если в индексе есть все столбцы A, B и C, можно избежать второго обращения к диску для получения данных.