У меня есть веб-сайт ASP.NET, который выполняет свое независимое кэширование данных, и данные не меняются в течение длительных периодов времени, поэтому нет необходимости запрашивать SQL Server второй раз с тем же запросом. Мне нужно улучшить производительность запросов с первого раза (девственных), которые идут к этому SQL Server. Некоторые запросы обрабатывают так много данных, что могут вызвать использование SQL Server tempdb
. Я не использую переменные временных таблиц или временные таблицы, поэтому SQL Server решает использовать tempdb
сам, когда это необходимо.
Мой размер базы данных составляет 16 ГБ, на моем сервере доступно 32 ГБ физической памяти.
Я понимаю, что стратегия кэширования MS SQL Server пытается сохранить данные в оперативной памяти, чтобы ускорить выполнение аналогичных запросов, если им необходимо снова загрузить те же данные. В дополнение к этому он будет пытаться использовать доступную оперативную память вместо базы данных tempdb для ускорения работы без доступа к диску.
Я предполагаю, что когда приходит запрос, который должен что-то хранить в базе данных tempdb, SQL Server и не хватает ОЗУ, у SQL Server есть 2 варианта:
1) выгрузить некоторые кэшированные данные и использовать сэкономленную оперативную память вместо базы данных tempdb, чтобы избежать записи на диск
2) сохранить кэшированные данные для будущих запросов и начать использовать базу данных tempdb, что приводит к записи на медленный диск.
Я не знаю, какой выбор будет делать SQL Server в этой ситуации, но мне бы хотелось, чтобы он сделал выбор № 1, потому что меня волнует только выполнение первичных (целочисленных) запросов, потому что я никогда больше не отправляю тот же запрос на SQL Server. (хотя я могу отправить аналогичный запрос).
Какова стратегия кэширования SQL Server для этого сценария?
Как это уравновешивает использование оперативной памяти между отказом от базы данных tempdb для первичных запросов и скоростью запросов второго раза?
Можно ли настроить SQL Server таким образом, чтобы он сделал выбор № 1? Если да, то как?
Как еще можно повысить производительность всех первичных SQL-запросов?
Поскольку я не знаю стратегии кэширования SQL Server, я хочу разместить базу данных на RAM-диске. Это обеспечит высокую скорость загрузки некэшированных данных, даже если SQL Server всегда выбирает № 1. Риск этого заключается в том, что SQL Server может начать использовать больше базы данных tempdb с меньшим объемом доступной оперативной памяти (осталось только 16 ГБ после того, как я использую 16 ГБ для ОЗУ диска), если он продолжит делать выбор № 2, что замедлит выполнение тех девственных запросов, которые вызывают разливы tempdb
.
Меня интересует решение для SQL 2008 R2, но я думаю, что оно, вероятно, то же самое для SQL 2008, SQL 2005 и может быть SQL 2000.
Разъяснения:
На этом ящике не работают другие приложения, он предназначен для SQL Server . Сайт работает на отдельной коробке.
Это 64-разрядная версия SQL Server 2008 R2 Standard Edition в 64-разрядной версии Windows Server 2008 R2 Enterprise.
Я запускаю только запросы только для чтения, а база данных настроена только для чтения .
Давайте предположим, что уже есть хорошие показатели . Этот вопрос о том, как SQL Server делает выбор № 1 против выбора № 2, как он это делает, если есть способ управлять им и если RAM Disk помогает ему сделать правильный выбор для первичных запросов.