В SQL Server sys.dm_os_memory_cache_entries
можно просматривать как первоначальную стоимость записи в кэше, так и текущую стоимость записи в кэше ( original_cost
и current_cost
соответственно). DMV sys.dm_os_buffer_descriptors
содержит запись страниц, которые в настоящее время находятся в памяти, а также некоторые метаданные о страницах. Одна интересная порция информации, которой нет в DVM, это значения LRU-K для страниц данных.
Можно ли получить значения LRU-K для страниц данных в пуле буферов в SQL Server? Если да, то как?
sql-server
Иеремия Пешка
источник
источник
Ответы:
На самом деле, насколько я понимаю, нет никакого полезного способа сделать это.
В другом ответе упоминается,
DBCC PAGE
и читатель может выяснить детали. Из экспериментов я предполагаю, что они имеют в видуbUse1
.При этом не учитывается, что
DBCC PAGE
это само использование страницы, и значение обновляется, прежде чем оно будет показано нам.Сценарий, демонстрирующий это ниже (занимает 12 секунд).
Типичные результаты
Со вторым результатом
Выход после 7-секундной задержки увеличивается на 7, а после 5-секундной задержки на 5.
Таким образом, кажется очевидным, что эти значения LRU являются секундами с некоторой эпохи. Перезапуск службы SQL Server не меняет эпоху, но перезапускает машину.
Значение переворачивается каждые 65 536 секунд, поэтому я предполагаю, что оно просто использует что-то вроде
system_up_time mod 65536
Это оставляет один вопрос без ответа в моем уме (любые берущие?). SQL Server использует
LRU-K
сK=2
согласно внутренним книгам. Там не должно бытьbUse2
? Если так, то где это?bUse1
Хотя есть один способ наблюдать значение, не меняя его, о котором я знаю, и это продемонстрировал Боб Уорд здесь.Присоедините отладчик к процессу SQL Server и отобразите в памяти ссылки для адреса памяти структуры буфера (показано
0x00000002FE1F1440
выше).Я сделал это сразу после запуска сценария выше и увидел следующее.
(Из предыдущих экспериментов я обнаружил, что выделенные байты были единственными, которые менялись между прогонами, так что они определенно правильные).
Одним удивительным аспектом является то, что
SELECT CAST(0xc896 as int)
=51350
.Это ровно на 3600 (один час) меньше, чем сообщалось
DBCC PAGE
.Я считаю, что это попытка отрицать страницы, хранящиеся в кеше, вызывая
DBCC PAGE
себя. Для «нормальной» страницы выбора эта часовая корректировка не происходит. После запускаПоказанное в памяти значение соответствует ожидаемому.
Команда
DBCC
фактически обновляет это значение дважды. Однажды вС более высоким значением, то снова при
С нижним.
Я не знаю ни одного способа получить адреса буферов для страниц, не используя
DBCC BUFFER
/DBCC PAGE
каким-либо образом, и используя оба эти изменения, значение, которое мы пытаемся проверить!источник
Как я упоминал г-ну Пешке в твиттере, эта информация хранится в структуре BUF, которая хранит страницу в памяти. DBCC PAGE предоставляет вам эту информацию как часть своего заголовка.
источник
DBCC PAGE
это ужасный способ найти что-нибудь, но вы, похоже, правы. Жаль, что данныеDBCC PAGE
, по сути, являются бессмысленными и не относятся к какому-либо реальному системному времени.