@RedQuark

Кэширование таблиц

Если способы заставить закэшировать конкретные таблицы в памяти mssql сервера 2008 принудительно? Или дать большой приоритет для кэширования конкретной таблицы?

Например есть таблица со списком документов, в 20 тыс. записей и она одна из главных в системе. Полная ее выборка при нагруженном сервере составляет 6 секунд, что непозволительно долго. Вызывается она через процедуру где есть suser_name(), что делает автоматическое кэширование недееспособным.
  • Вопрос задан
  • 4459 просмотров
Пригласить эксперта
Ответы на вопрос 3
@rPman
Очень давно не работал с mssql, если внутрь уже готовых функций лезть никак 9а это единственно верный способ оптимизации), то у вас есть два способа:
1. разместить таблицу в отдельном таблеспейсе на ram диске (не рекомендуется, так как в случае аварийной остановки сервера базу придется чинить, но это гарантированно разместит данные только в оперативной памяти)
2. создать таблицу в памяти (точнее в tempdb) stackoverflow.com/questions/27835/does-ms-sql-support-in-memory-tables и прилинковать через вьюху
Оба метода требуют дополнительных скриптов, по наполнению этих таблиц при перезапуске сервера а так же самое главное по сохранению изменений, ничего лучше кроме копирования изменений в нормальную таблицу тригером не приходит в голову — очень эффективно, чуть по сложнее — поднять еще одну базу и настроить репликацию (но цена вопроса — удорожание лицензии на серверный софт)

p.s. кстати две или более базы, разнесенные по серверам или даже географически могут позволить схемы, когда полностью вся база размещена в оперативной памяти.
Ответ написан
@lavel
Сложно представить задачу, где на клиенте понадобятся все 20 тыс. записей в неагрегированном виде. Если по теме, то для таблицы, а также каждого из индексов этой таблицы можно создать отдельные filegroup, которые можно поместить на отдельные жесткие диски и получить почти параллельное чтение\запись.
Ответ написан
unfilled
@unfilled
Раньше был DBCC PINTALBE, сейчас такого механизма нет (да и PINTABLE особо не рекомендовалось к использованию).
ИМХО, вы зря не хотите разбираться с запросами и индексами. «Закрепление» таблицы в памяти может вам и не помочь. Например, вы таблицу «закрепили», а пользователь бабахнул запрос с 10 кросс джойнами этой таблицы — в данном случае, вне зависимости от того «закреплена» она или нет, памяти уйдёт намного больше чем предполагалось.
Плюс, suser_name() никак на кэширование данных не влияет — почему вы считаете, что кэширование не дееспособно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы