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

Откуда: Россия, Москва
Сообщений: 1542
Добрый день!
Возник вопрос, занимают ли неиспользуемые таблицы оперативную память sql сервера (2012ый)? Я утверждал, что не занимают. Написал запрос, который показывает какая таблица сколько страниц в памяти занимает
select	OBJECT_NAME(object_id) as ObjectName
	,	object_id
	,	PageCount
	,	1.0 * PageCount / 128 MemSize
from	(	select	b.database_id
				,	p.object_id
				,	count(*) as PageCount
			from	sys.dm_os_buffer_descriptors b
					left join sys.allocation_units a on a.allocation_unit_id = b.allocation_unit_id
					left join sys.partitions p on (a.type in (1,3) and p.hobt_id = a.container_id) /*or (a.type = 2 and p.partition_id = a.container_id)*/
			where	b.database_id = 7
			group	by b.database_id, p.object_id
		) A
order	by PageCount desc


И оказалось, что он возвращает таблицы, которые не используются, по ним даже нет данных в отчете по использованию индексов! Подскажите, куда копать?

Спасибо


С уважением, Князев Константин
5 июн 14, 17:58    [16127985]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
Бэкпы, ребилды, обновления статистик и прочие регламенты могут поднимать в память все, что угодно.
5 июн 14, 18:01    [16128008]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37040
существует ли возможность избирательно чистить буфер данных?
5 июн 14, 18:10    [16128054]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
o-o
Guest
Гавриленко Сергей Алексеевич
Бэкпы, ребилды, обновления статистик и прочие регламенты могут поднимать в память все, что угодно.

а врут что-ли, когда пишут, что Backups don't run through the buffer pool?
100% это было где-то у Рэндала, сходу не могу найти
5 июн 14, 18:11    [16128055]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wizandr
существует ли возможность избирательно чистить буфер данных?

Если эти данные не сипользуются, то они и так будут вытеснены из кэша.
Даже, если вы освободите кэш, то нужных вам данных там все равно не будет. Пока вы не начнете с ними работать.
5 июн 14, 18:12    [16128059]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
o-o
Гавриленко Сергей Алексеевич
Бэкпы, ребилды, обновления статистик и прочие регламенты могут поднимать в память все, что угодно.

а врут что-ли, когда пишут, что Backups don't run through the buffer pool?
100% это было где-то у Рэндала, сходу не могу найти
Ну да, бэкап скорее всего не через него - смысла нет.
5 июн 14, 18:13    [16128066]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1542
если бекап не поднимает таблицу, то Check Itegrity может поднять?
5 июн 14, 18:32    [16128132]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
Zelius
если бекап не поднимает таблицу, то Check Itegrity может поднять?
Элементарны тест показывает, что да.

Не запускайте следующий скрипт на продакшн-сервере, он сбрасывает буфер пулл.

set nocount on
go
use tempdb
go
if object_id('tempdb..#get_bp_info') is not null
    drop proc #get_bp_info
go
create proc #get_bp_info
as    
    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')
      and objectproperty(obj.objectid, 'IsMsShipped') = 0
    group by obj.name, ind.name, obj.index_id
    order by cached_pages_count desc
go

if object_id('dbo.TestCheckDb') is not null
    drop table dbo.TestCheckDb
go    
create table dbo.TestCheckDb ( id int primary key ) 
insert dbo.TestCheckDb ( id ) select 1
go
checkpoint
dbcc dropcleanbuffers WITH NO_INFOMSGS  
go
exec #get_bp_info
go
dbcc checktable ('TestCheckDb') WITH NO_INFOMSGS 
go
exec #get_bp_info
go

cached_pages_count objectname                                                                                                                       indexname                                                                                                                        indexid
------------------ -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -----------

cached_pages_count objectname                                                                                                                       indexname                                                                                                                        indexid
------------------ -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -----------
1                  TestCheckDb                                                                                                                      PK__TestChec__3213E83F23817F9A                                                                                                   1
5 июн 14, 18:50    [16128194]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про кеширование неиспользованных таблиц (MSSQL 2012)  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1542
Ясно. Спасибо!
6 июн 14, 00:43    [16129507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить