Использование памяти SQL Server для одного запроса - PullRequest
7 голосов
/ 21 июля 2011

Я хотел бы выяснить или хотя бы оценить, сколько памяти занимает один запрос (конкретный запрос) при выполнении. Здесь нет смысла публиковать запрос, так как я хотел бы сделать это для нескольких запросов и посмотреть, есть ли изменения в разных базах данных. Есть ли способ получить эту информацию?

Использование SQL Server 2008 R2

спасибо

Гилад.

Ответы [ 2 ]

6 голосов
/ 21 июля 2011

Что вы подразумеваете под «сколько памяти потребляет запрос?» И почему именно вы хотите это знать?

Я не думаю, что память в SQL Server работает так, как вы можете себе представить -Управление памятью в SQL Server - сложная тема невероятно - вы можете легко написать целые книги об управлении памятью в SQL Server.Я не могу утверждать, что знаю , что много об управлении памятью SQL Server, но я знаю, что практически нет полезной информации, которую можно экстраполировать, зная, сколько памяти занимает один запрос.

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

Обратите внимание, что для страницы данныхили индексная страница, которую нужно использовать, она должна существовать в памяти - это означает, что, если она еще не существует в памяти в другом месте, готовом к использованию, должен быть доступен свободный буфер для подготовки страницы к.Пул буферов служит как пулом «расходуемых» свободных буферов, так и кешем страниц, уже присутствующих в памяти.

Вы можете проверить, что находится в пуле буферов, используя DMV, в этом списке есть подходящий запрос.страница:

Очистив пул буферов с помощью команды DBCC DROPCLEANBUFFERS ( DONT DOЭТО НА ПРОДУКЦИОННОМ СЕРВЕРЕ SQL !!! ) и затем, выполняя ваш запрос, теоретически новые страницы, которые появляются в пуле буферов, должны быть страницами, которые использовались в последнем запросе.

Это может дать вам приблизительное представление о страницах данных и индексов, используемых в запросе, однако не охватывает другие области SQL Server, где используется память, например, в кеше плана запросов, SQL Server Workers.и т. д.

Как я уже говорил, управление памятью в SQL Server является сложным - если вы действительно хотите узнать больше, я рекомендую вам купить книгу по внутренним компонентам SQL Server.

Обновление: Вы также можете использовать статистику запроса для просмотра совокупной статистики производительности для запроса, включая «физическое чтение» (чтение страниц с диска) и «логическое чтение» (чтение страниц из пула буферов).См. на этой странице , чтобы найти подходящий запрос.

Это может также дать вам несколько советов о том, сколько памяти использует запрос, но будьте осторожны - играя вокруг, я нашел запросы, которые выполняли гораздо более логичныечитает, а не выполняет физическое чтение, что, насколько я могу понять, означало, что они читают одни и те же страницы снова и снова, то есть 100 логических операций чтения = 100 страниц, используемых в пуле буферов.

6 голосов
/ 21 июля 2011

Возможно, вы захотите взглянуть на DMV (Dynamic Management Views) и, в частности, на sys.dm_exec_query_memory_grants .См., Например, этот запрос (взятый из здесь ):

DECLARE @mgcounter INT
SET @mgcounter = 1
WHILE @mgcounter <= 5 -- return data from dmv 5 times when there is data
BEGIN
    IF (SELECT COUNT(*)
      FROM sys.dm_exec_query_memory_grants) > 0
    BEGIN
             SELECT *
             FROM sys.dm_exec_query_memory_grants mg
                         CROSS APPLY sys.dm_exec_sql_text(mg.sql_handle) -- shows query text
             -- WAITFOR DELAY '00:00:01' -- add a delay if you see the exact same query in results
             SET @mgcounter = @mgcounter + 1
    END
END

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

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