Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Данные по номеру страницы / 16 сообщений из 16, страница 1 из 1
12.03.2019, 17:20
    #39784986
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
Добрый день.

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

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

Но если способы есть и они известны, то буду рад их увидеть:)
...
Рейтинг: 0 / 0
12.03.2019, 17:23
    #39784989
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
DanionДобрый день.

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

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

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

dbcc page
...
Рейтинг: 0 / 0
12.03.2019, 17:39
    #39785004
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
DanionПолучить название базы, таблицы, номер страницы и вроде строки возможно. А вот можно ли как-то привязать это к конкретным данным?
Код: sql
1.
2.
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 = ...;

Значения для фильтров брать из графа дедлока.
...
Рейтинг: 0 / 0
12.03.2019, 18:03
    #39785020
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
Спасибо за оперативные ответы.

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+ минут, пока тормознул его.
Продолжу завтра.
...
Рейтинг: 0 / 0
12.03.2019, 18:12
    #39785024
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
DanionDBCC PAGE - вроде несколько не то. https://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/
Danionна 5 ГБ таблице выполняется 8+ минутЛюбопытство требует жертв. По-любому придется сканировать всю таблицу.
...
Рейтинг: 0 / 0
12.03.2019, 19:36
    #39785048
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
invmПо-любому придется сканировать всю таблицу.Сканировать да, но не обязательно дешифровать всю таблицу, да еще и скаляркой, именно на это все время и тратится. Вот так работает значительно быстрее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
12.03.2019, 19:46
    #39785055
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
invmDanionDBCC PAGE - вроде несколько не то. https://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/
Danionна 5 ГБ таблице выполняется 8+ минутЛюбопытство требует жертв. По-любому придется сканировать всю таблицу.
Если есть уже номер страницы зачем сканировать всю?
DBCC PAGE как раз и решает задачу автора
...
Рейтинг: 0 / 0
12.03.2019, 19:50
    #39785061
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
MindВот так работает значительно быстрееДа, точно. Спасибо.
...
Рейтинг: 0 / 0
12.03.2019, 20:00
    #39785065
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
msLexЕсли есть уже номер страницы зачем сканировать всю?
DBCC PAGE как раз и решает задачу автораЯ тоже так сначала подумал, но это не совсем то что хочет ТС. Ему надо реальные данные увидеть, я так понимаю в human readable формате, а не в бинарном.
...
Рейтинг: 0 / 0
12.03.2019, 20:05
    #39785068
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
MindmsLexЕсли есть уже номер страницы зачем сканировать всю?
DBCC PAGE как раз и решает задачу автораЯ тоже так сначала подумал, но это не совсем то что хочет ТС. Ему надо реальные данные увидеть, я так понимаю в human readable формате, а не в бинарном.

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

Это, конечно, не selectg, но зато значительно быстрее
...
Рейтинг: 0 / 0
13.03.2019, 09:49
    #39785193
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
Добрый день.

DBCC TRACEON(3604)
GO

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

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

Попробую ещё вариант от Mind.
...
Рейтинг: 0 / 0
13.03.2019, 10:05
    #39785201
Danion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
Похоже что-то не так делаю. Указал @file_id int, @page_id такие же, как для первого варианта. В селекте указал таблицу. В итоге результат пустой.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
13.03.2019, 11:12
    #39785239
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
DanionПохоже что-то не так делаюВидимо указываете неверные исходные данные. Ибо чудес не бывает.

Кстати, для разруливания дедлоков данные из таблиц/индексов не нужны.
...
Рейтинг: 0 / 0
13.03.2019, 20:33
    #39785595
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
invmDanionПохоже что-то не так делаюВидимо указываете неверные исходные данные. Ибо чудес не бывает.%%physloc%% - это же указатель на данные, а если страница индексная то вряд ли что-то покажет.
...
Рейтинг: 0 / 0
13.03.2019, 21:01
    #39785601
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
Mindа если страница индексная то вряд ли что-то покажет.Судя по 21830988 , таки да, индексная.
...
Рейтинг: 0 / 0
13.03.2019, 22:09
    #39785615
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные по номеру страницы
Mindinvmпропущено...
Видимо указываете неверные исходные данные. Ибо чудес не бывает.%%physloc%% - это же указатель на данные, а если страница индексная то вряд ли что-то покажет.

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



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

инфу о индексе покажет или dbcc page или посмотреть в sys.dm_db_database_page_allocations
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Данные по номеру страницы / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]