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

Откуда: Moscow
Сообщений: 1045
снова на ночь глядя решил поиграться со статистикой чтений и что то показания set statistics io не сходятся с показаниями logical_reads в dmv


репро:
drop table if exists buf_test;
select top (100000)
      identity(int, 1,1) as id
into buf_test 
from master.dbo.spt_values c1 
    cross join master.dbo.spt_values c2;

set statistics io on;

begin tran;
select * from buf_test with(repeatableread, paglock)
waitfor delay '00:00:05'
commit


в другой сессии пока идет waitfor
select logical_reads from sys.dm_exec_requests where session_id = 79 --id первой сессии

select total_pages, data_pages, * from sys.partitions p join sys.allocation_units au on au.container_id = p.partition_id where p.object_id = object_id('buf_test')


итог:
Table 'buf_test'. Scan count 1, logical reads 335, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

sys.dm_exec_requests.logical_reads == 343

результат statistics io совпадает с количеством страниц data_pages в allocation_units и это гут.
не гут: что я не могу понять откуда берутся лишние чтения для sys.dm_exec_requests при учете что sql trace / XE по sql_statement_completed показывают цифры по чтениям теже что DMV

create event session reads_stats on server 
add event physical_page_read(where session_id=79),
add event page_reference_tracker(where session_id = 79),
add event lock_acquired (where session_id = 79 and resource_type = 'PAGE'),
add event scan_stopped (where session_id = 79),
add event sql_batch_completed (where session_id = 79),
add event sql_statement_completed (where session_id = 79)
with  (max_memory = 16 MB, EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS, MAX_DISPATCH_LATENCY=3 SECONDS)


кол-во событий lock_acquired на страницы ровно столько сколько data_pages, а вот результаты событий sql_batch_completed уже рисуют цифорки что показывает DMV

кто мне скажет что сиквел может такого дочитывать что влияет на показатель lr dmv причем в разных вариантах по разному при селекте из маленькой таблички не существенно а из большой разница может доходить до 1000 страниц при том что фактически страниц данных оператор вычитывает всего 40-50?
аля io: 46 vs dmv:1633
8 окт 19, 22:43    [21989918]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_exec_requests logical_reads  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29246
felix_ff
не гут: что я не могу понять откуда берутся лишние чтения для sys.dm_exec_requests при учете что sql trace / XE по sql_statement_completed показывают цифры по чтениям теже что DMV
Возможно, в sys.dm_exec_requests показывается общее количество чтений, которые понадобилось сделать для выполнения запроса. Включая чтения планов из кэша, чтение метаданных таблицы, и т.п.
А в статистике показаны только чтения страниц таблицы.
8 окт 19, 23:03    [21989929]     Ответить | Цитировать Сообщить модератору
 Re: sys.dm_exec_requests logical_reads  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1045
alexeyvg,

возможно но показетель очень сильно разнится, я не думаю что метаданные могли бы занимать 12 метров при вычитке из таблицы всего 400 КБ.

собственно я почему и обратил внимание у меня диссонанс происходит на таком запросе:
select top (1000) * from [dbo].[table_with_1222640_rows] with(index=0)
select top (1000) * from [dbo].[table_with_1222640_rows] with(index=2)
select top (1000) * from [dbo].[table_with_1222640_rows] with(index=3)


io:46 dmv:1639 --index0
io:24 dmv:30 --index2
io:1025 dmv:1097 --index3


возможно на это влияет фрагментация:
index 0 :44,4270907283828
index 2: 3,271484375
index 3: 30,6168224299065

но на куче она 44% на 3 индексе 30% а разница по статистикам не сходится, у кучи отклонение большое у индекса не особо
8 окт 19, 23:17    [21989939]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить