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

Откуда:
Сообщений: 6
День добрый.

Имеется несколько БД на едином сервере, причем с базами работают одновременно большое количество клиентских программ. Бывают моменты когда затруднен доступ (медленная обработка запросов) то к одной БД то к другой по причине соперничества за ресурсы между двумя базами.

Каким способом можно в реалтайме посмотреть выделенные сервером ресурсы (ЦП, оперативная память) под работу обоих БД ?
26 мар 13, 12:50    [14096305]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать потребление памяти несколькими БД ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
Память - очень просто (убрать фильтр по db_id() и добавить группировку по database_id):
select
       count(*)as cached_pages_count,
       obj.name as objectname,
       ind.name as indexname,
       obj.index_id as indexid
from sys.dm_os_buffer_descriptors as bd
    inner join
    (
        select       object_id as objectid,
                           object_name(object_id) as name,
                           index_id,allocation_unit_id
        from sys.allocation_units as au
            inner join sys.partitions as p
                on au.container_id = p.hobt_id
                    and (au.type = 1 or au.type = 3)
        union all
        select       object_id as objectid,
                           object_name(object_id) as name,
                           index_id,allocation_unit_id
        from sys.allocation_units as au
            inner join sys.partitions as p
                on au.container_id = p.partition_id
                    and au.type = 2
    ) as obj
        on bd.allocation_unit_id = obj.allocation_unit_id
left outer join sys.indexes ind 
  on  obj.objectid = ind.object_id
 and  obj.index_id = ind.index_id
where bd.database_id = db_id()
  and bd.page_type in ('data_page', 'index_page')
group by obj.name, ind.name, obj.index_id
order by cached_pages_count desc
26 мар 13, 13:03    [14096388]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать потребление памяти несколькими БД ?  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
SELECT * FROM :: fn_virtualfilestats(dbid, fileid)
-- инфа о IO в файл, укажите в цифрах ваш dbid и fileid, загуглите что означают результаты данной команды и проанализируйте.
26 мар 13, 13:21    [14096510]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать потребление памяти несколькими БД ?  [new]
rigos
Member

Откуда:
Сообщений: 6
Благодарю за ответы!
26 мар 13, 14:25    [14096955]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать потребление памяти несколькими БД ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гавриленко Сергей Алексеевич
Память - очень просто (убрать фильтр по db_id() и добавить группировку по database_id):

Не-не-не, не так просто. Представления sys.allocation_units и sys.partitions возвращают данные только для текущей БД, поэтому если просто "убрать фильтр по db_id() и добавить группировку по database_id", то будут неправильные результаты.

Можно либо посчитать суммарное потребление памяти с разбивкой по БД:
select
       count(*) as cached_pages_count,
       db_name(bd.database_id) as db
from sys.dm_os_buffer_descriptors as bd
group by bd.database_id
order by cached_pages_count desc

Либо, взяв ваш скрипт за основу, приделать к нему проход в цикле по всем базам, с сохранением результата во временной таблице.
26 мар 13, 14:40    [14097053]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать потребление памяти несколькими БД ?  [new]
rigos
Member

Откуда:
Сообщений: 6
Гость333
Гавриленко Сергей Алексеевич
Память - очень просто (убрать фильтр по db_id() и добавить группировку по database_id):

Не-не-не, не так просто. Представления sys.allocation_units и sys.partitions возвращают данные только для текущей БД, поэтому если просто "убрать фильтр по db_id() и добавить группировку по database_id", то будут неправильные результаты.

Можно либо посчитать суммарное потребление памяти с разбивкой по БД:
select
       count(*) as cached_pages_count,
       db_name(bd.database_id) as db
from sys.dm_os_buffer_descriptors as bd
group by bd.database_id
order by cached_pages_count desc

Либо, взяв ваш скрипт за основу, приделать к нему проход в цикле по всем базам, с сохранением результата во временной таблице.


спасибо!

если кому надо еще то нашел статью, обобщающую выше обсуждаемое - http://k-semenenko-pro.blogspot.ru/2011/07/ms-sql-server.html.
26 мар 13, 15:42    [14097487]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить