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

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

Во время разбора причин блокировок и дедлоков возник вопрос - можно ли найти, что за данные в таблице были нужны обеим сессиям.

Получить название базы, таблицы, номер страницы и вроде строки возможно. А вот можно ли как-то привязать это к конкретным данным? В sys.sysprocesses, sys.dm_exec_sql_text подобного нет. Мне кажется, что такое сделать нельзя. Поиском ничего похоже пока не нашёл.

Но если способы есть и они известны, то буду рад их увидеть:)
12 мар 19, 17:20    [21830546]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
msLex
Member

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

Во время разбора причин блокировок и дедлоков возник вопрос - можно ли найти, что за данные в таблице были нужны обеим сессиям.

Получить название базы, таблицы, номер страницы и вроде строки возможно. А вот можно ли как-то привязать это к конкретным данным? В sys.sysprocesses, sys.dm_exec_sql_text подобного нет. Мне кажется, что такое сделать нельзя. Поиском ничего похоже пока не нашёл.

Но если способы есть и они известны, то буду рад их увидеть:)


dbcc page
12 мар 19, 17:23    [21830553]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
invm
Member

Откуда: Москва
Сообщений: 8441
Danion
Получить название базы, таблицы, номер страницы и вроде строки возможно. А вот можно ли как-то привязать это к конкретным данным?
select * from MyTable where %%lockres%% = ...;
select t.* from MyTable t cross apply sys.fn_PhysLocCracker(t.%%physloc%%) plc where plc.file_id = ... and plc.page_id = ...;
Значения для фильтров брать из графа дедлока.
12 мар 19, 17:39    [21830586]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
Danion
Member

Откуда: Москва
Сообщений: 86
Спасибо за оперативные ответы.

DBCC PAGE - вроде несколько не то.

select t.* from MyTable t cross apply sys.fn_PhysLocCracker(t.%%physloc%%) plc where plc.file_id = ... and plc.page_id = ...; на 5 ГБ таблице выполняется 8+ минут, пока тормознул его.
Продолжу завтра.
12 мар 19, 18:03    [21830613]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
invm
Member

Откуда: Москва
Сообщений: 8441
Danion
DBCC PAGE - вроде несколько не то.
https://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/
Danion
на 5 ГБ таблице выполняется 8+ минут
Любопытство требует жертв. По-любому придется сканировать всю таблицу.
12 мар 19, 18:12    [21830624]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2197
invm
По-любому придется сканировать всю таблицу.
Сканировать да, но не обязательно дешифровать всю таблицу, да еще и скаляркой, именно на это все время и тратится. Вот так работает значительно быстрее:

declare @file_id int = ...
declare @page_id int = ...

declare @slot_id1 int = 0
declare @slot_id2 int = 65535
declare @physical_locator1 binary (8)
declare @physical_locator2 binary (8)

SELECT @physical_locator1 = convert (binary (4), reverse ( convert (binary (4), @page_id)))
+ convert (binary (2), reverse ( convert (binary (2), @file_id)))
+ convert (binary (2), reverse ( convert (binary (2), @slot_id1)))

SELECT @physical_locator2 = convert (binary (4), reverse ( convert (binary (4), @page_id)))
+ convert (binary (2), reverse ( convert (binary (2), @file_id)))
+ convert (binary (2), reverse ( convert (binary (2), @slot_id2)))

SELECT * FROM dbo.MyTable AS T cross apply sys.fn_PhysLocCracker(t.%%physloc%%) plc WHERE %%physloc%% BETWEEN @physical_locator1 AND @physical_locator2
12 мар 19, 19:36    [21830664]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
msLex
Member

Откуда:
Сообщений: 5797
invm
Danion
DBCC PAGE - вроде несколько не то.
https://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/
Danion
на 5 ГБ таблице выполняется 8+ минут
Любопытство требует жертв. По-любому придется сканировать всю таблицу.

Если есть уже номер страницы зачем сканировать всю?
DBCC PAGE как раз и решает задачу автора
12 мар 19, 19:46    [21830673]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
invm
Member

Откуда: Москва
Сообщений: 8441
Mind
Вот так работает значительно быстрее
Да, точно. Спасибо.
12 мар 19, 19:50    [21830680]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2197
msLex
Если есть уже номер страницы зачем сканировать всю?
DBCC PAGE как раз и решает задачу автора
Я тоже так сначала подумал, но это не совсем то что хочет ТС. Ему надо реальные данные увидеть, я так понимаю в human readable формате, а не в бинарном.
12 мар 19, 20:00    [21830687]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
msLex
Member

Откуда:
Сообщений: 5797
Mind
msLex
Если есть уже номер страницы зачем сканировать всю?
DBCC PAGE как раз и решает задачу автора
Я тоже так сначала подумал, но это не совсем то что хочет ТС. Ему надо реальные данные увидеть, я так понимаю в human readable формате, а не в бинарном.


У DBCC PAGE есть вполне human readable формат вывода данных

Это, конечно, не selectg, но зато значительно быстрее
12 мар 19, 20:05    [21830692]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
Danion
Member

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

DBCC TRACEON(3604)
GO

DBCC PAGE (MyDB', 1, 23876317, 3) WITH TABLERESULTS
GO

Да, такой вариант выдаёт две таблицы, в нижней данные уже в человеческом виде.

Попробую ещё вариант от Mind.
13 мар 19, 09:49    [21830988]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
Danion
Member

Откуда: Москва
Сообщений: 86
Похоже что-то не так делаю. Указал @file_id int, @page_id такие же, как для первого варианта. В селекте указал таблицу. В итоге результат пустой.

declare @file_id int = 1
declare @page_id int = 23876317

declare @slot_id1 int = 0
declare @slot_id2 int = 65535
declare @physical_locator1 binary (8)
declare @physical_locator2 binary (8)

SELECT @physical_locator1 = convert (binary (4), reverse ( convert (binary (4), @page_id)))
+ convert (binary (2), reverse ( convert (binary (2), @file_id)))
+ convert (binary (2), reverse ( convert (binary (2), @slot_id1)))

SELECT @physical_locator2 = convert (binary (4), reverse ( convert (binary (4), @page_id)))
+ convert (binary (2), reverse ( convert (binary (2), @file_id)))
+ convert (binary (2), reverse ( convert (binary (2), @slot_id2)))

SELECT * FROM [MyDB].[dbo].[Table1] AS T cross apply sys.fn_PhysLocCracker(t.%%physloc%%) plc WHERE %%physloc%% BETWEEN @physical_locator1 AND @physical_locator2
13 мар 19, 10:05    [21831003]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
invm
Member

Откуда: Москва
Сообщений: 8441
Danion
Похоже что-то не так делаю
Видимо указываете неверные исходные данные. Ибо чудес не бывает.

Кстати, для разруливания дедлоков данные из таблиц/индексов не нужны.
13 мар 19, 11:12    [21831072]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2197
invm
Danion
Похоже что-то не так делаю
Видимо указываете неверные исходные данные. Ибо чудес не бывает.
%%physloc%% - это же указатель на данные, а если страница индексная то вряд ли что-то покажет.
13 мар 19, 20:33    [21831809]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
invm
Member

Откуда: Москва
Сообщений: 8441
Mind
а если страница индексная то вряд ли что-то покажет.
Судя по 21830988, таки да, индексная.
13 мар 19, 21:01    [21831825]     Ответить | Цитировать Сообщить модератору
 Re: Данные по номеру страницы  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 980
Mind
invm
пропущено...
Видимо указываете неверные исходные данные. Ибо чудес не бывает.
%%physloc%% - это же указатель на данные, а если страница индексная то вряд ли что-то покажет.


надо тогда знать к какому индексу относится страница в таком случае
select * from [table] with(index=2) where %%physloc%% between @l1 and @l2


найдет данные по индексной странице.

инфу о индексе покажет или dbcc page или посмотреть в sys.dm_db_database_page_allocations
13 мар 19, 22:09    [21831878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить