Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Закешировать часть данных  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Всем привет,

Есть такая задача. Есть таблица, в которой примерно 300 тыс записей. Есть сложный запрос, который вытаскивает из этой таблицы данные за сегодня плюс делает кучу джойнов плюс. Запрос выполняется 3-4 секунды, что не приемлемо. Одновременно на сервер может идти достаточно большой кол-во таких запросов от разных пользователей, т.е. с разными параметрами, поэтому надеяться на то что сиквел-сервер задействует кеш не приходиться. Есть ли какое-нибудь решение, чтобы сказать сиквелу: загрузи в память все строчки из этой таблицы за сегодня?
4 июл 12, 15:44    [12816852]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Kudep
Одновременно на сервер может идти достаточно большой кол-во таких запросов от разных пользователей, т.е. с разными параметрами, поэтому надеяться на то что сиквел-сервер задействует кеш не приходиться. Есть ли какое-нибудь решение, чтобы сказать сиквелу: загрузи в память все строчки из этой таблицы за сегодня?
Т.е. вы уже проверили, что таблица в кеш не грузится, да?
4 июл 12, 15:45    [12816863]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
AlexMajic
Member

Откуда: Kiev
Сообщений: 99
а не проще вьюху нарисовать, где обрезать данные на getdate и на ней уже строить запросы?
4 июл 12, 15:47    [12816874]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
Kudep
поэтому надеяться на то что сиквел-сервер задействует кеш не приходиться.

очень странный вывод

если приходящие запросы обращаются к данным за сегодня, то именно эта часть таблицы и будет кеширована
4 июл 12, 16:02    [12816994]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kudep
Одновременно на сервер может идти достаточно большой кол-во таких запросов от разных пользователей, т.е. с разными параметрами, поэтому надеяться на то что сиквел-сервер задействует кеш не приходиться.

Кэш данных и кэш планов выполнения - это два разных кэша.
4 июл 12, 16:04    [12817012]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
Kudep
Есть таблица, в которой примерно 300 тыс записей.
Какой размер записи, то есть какой размер таблицы?

Если таблица помещается в память, то она там и будет, независимо от того, разные запросы от пользователей или одинаковые.

Если пользователи (приложение) обращаются к части данных "за сегодня", то именно эти данные и будут в памяти, в кеше. Никаких инструкций серверу дополнительно давать не надо.

Другое дело, если памяти меньше, чем данных "за сегодня". Но тут вам на месте виднее - вам нужно расчитать необъходимый объём кеша, убедиться, что памяти сервера достаточно для кеширования и убедиться, что даные лежат в кеше и обращений к диску нет. Если это не так, нужно искать проблему (например, сиквел настроен на использовании 10% памяти сервера).
4 июл 12, 16:53    [12817382]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
alexeyvg
Если пользователи (приложение) обращаются к части данных "за сегодня", то именно эти данные и будут в памяти, в кеше. Никаких инструкций серверу дополнительно давать не надо.
Да, и конечно, нужно смотреть, что серверу для выполнения запроса достаточно данных "за сегодня". Если запрос не оптимальный, нет индексов и всё такое, то серверу придётся сканировать всю таблицу. Так что смотрите план запроса - какие данные на самом деле требуются.
4 июл 12, 17:03    [12817471]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
ага, т.е. даже не смотря на то, что параметры запроса разные (все запросы за сегодня, но есть отличия в других параметрах), таблица все-равно закачается в кеш??
Т.е. пришел один запрос, вытащил 1000 строк за сегодня.
Пришел второй запрос, который тоже хочет вытащить данные за сегодня, но это уже будут другие 1000 строк. И в этом случае они все будут взяты из кеша??
4 июл 12, 17:22    [12817627]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kudep
Пришел второй запрос, который тоже хочет вытащить данные за сегодня, но это уже будут другие 1000 строк. И в этом случае они все будут взяты из кеша??

Если это _другие_ 1000 строк, которых нет в кэше, то они будут читаться с диска.
И после чтения они тоже окажутся в кэше, вместе с другой 1000-ю.

Сообщение было отредактировано: 4 июл 12, 17:24
4 июл 12, 17:24    [12817645]     Ответить | Цитировать Сообщить модератору
 Re: Закешировать часть данных  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
Kudep,

а почему вы решили что причина тормозов ваших запросов именно в работе кеша?
ну если очень надо, то вот вам :)
declare @today datetime = cast(getdate() as date)
select * from mytable where mydate >= @today and mydate < dateadd(dd, 1, @today)
4 июл 12, 17:47    [12817867]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить