Кеширование SQL-запросов - PullRequest
4 голосов
/ 21 апреля 2011

Если я загляну в свой профилировщик для SQL-сервера, он обнаружит множество повторяющихся запросов, таких как:

exec sp_executesql N'SELECT *
FROM [dbo].[tblSpecifications] AS [t0]
WHERE [t0].[clientID] = @p0
ORDER BY [t0].[Title]', N'@p0 int', @p0 = 21

Многие из этих запросов не нужны для отображения данных в реальном времени, то есть, если кто-то вставил новую запись, которая была сопоставлена ​​в этом запросе, не имеет значения, если она не отображается в течение часа после вставки .

Вы можете выводить кеш на страницы asp.net, но мне было интересно, была ли подобная функциональность на dbms (в частности, на SQL-сервере), которая сохраняет результаты запроса в кеш и обновляет этот кеш после заданного периода время, скажем, 1 час, с целью повышения скорости извлечения записей.

Ответы [ 4 ]

3 голосов
/ 25 апреля 2011

В SQL Server 2000 и более ранних версиях вы можете использовать DBCC PINTABLE (databaseid, tableid), но лучше всего разрешить SQL Server управлять вашей памятью

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

В противном случае время, в течение которого страница базы данных остается в памяти, определяется наименее недавно использованной политикой.В заголовке каждой страницы данных в кеше хранится информация о последних двух случаях ее обращения.Фоновый процесс сканирует кэш и уменьшает количество пользователей, если страница не была открыта с момента последнего сканирования.Когда SQL Server необходимо освободить кэш, страницы с самым низким количеством пользователей очищаются первыми.(Внутренние компоненты и устранение неполадок профессионального SQL Server 2008)

sys.dm_os_buffer_descriptors содержит по одной строке для каждой страницы данных, которая в данный момент находится в кэше

1 голос
/ 22 апреля 2011

Результаты запроса не кэшируются, но сами страницы данных будут оставаться в кэше, пока они не будут вытеснены другими операциями чтения.В следующий раз, когда ваш запрос будет отправлен, эти страницы будут считываться из памяти, а не с диска.

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

Многие люди думают: «кого волнует, сколько времени занимает запрос, работает ли он в пакетном режиме», но онине вижу влияния на другие процессы, такие как тот, который вы упомянули.

1 голос
/ 21 апреля 2011

Нет, но существует множество решений для кэширования, таких как http://memcached.org/ http://ehcache.org/

0 голосов
/ 25 апреля 2011

Чтобы не пропустить очевидное, вы также можете создать полностью отдельную таблицу отчетов и обновлять ее ежечасно. Хотя его заполнение и администрирование будет стоить дорого, вы можете ограничить поля тем, что необходимо, и оптимизировать индексы для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...