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

Откуда: Вологда
Сообщений: 190
Здравствуйте!

В 1С выполняется следующий оператор в транзакции:
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, 1);

В результате выполняется след. запрос:

exec sp_executesql N'UPDATE T1 SET _MessageNo = @P1
FROM _DocumentChngR12119 T1
WHERE T1._NodeTRef = @P2 AND T1._NodeRRef = @P3 AND T1._MessageNo IS NULL',N'@P1 numeric(10),@P2 varbinary(4),@P3 varbinary(16)',1,0x00008F99,0xAC39002264A3800E11E1AF1808102F86


План запроса следующий:
Картинка с другого сайта.

Текст плана:

StmtText                                                                                                                                                                                                                                                                                                                                                                                          
--------                                                                                                                                                                                                                                                                                                                                                                                          
Clustered Index Update(OBJECT:([TstVera].[dbo].[_DocumentChngR12119].[_Docum12119_ByDataKey_RR]), OBJECT:([TstVera].[dbo].[_DocumentChngR12119].[_Docum12119_ByNodeMsg_RNR]), SET:([TstVera].[dbo].[_DocumentChngR12119].[_MessageNo] = [@P1]))                                                                                                                                                   
  |--Compute Scalar(DEFINE:([Expr1012]=[Expr1012]))                                                                                                                                                                                                                                                                                                                                               
       |--Compute Scalar(DEFINE:([Expr1012]=CASE WHEN [Expr1002] THEN (1) ELSE (0) END))                                                                                                                                                                                                                                                                                                          
            |--Compute Scalar(DEFINE:([Expr1002]=CASE WHEN [TstVera].[dbo].[_DocumentChngR12119].[_MessageNo] as [T1].[_MessageNo] = [@P1] THEN (1) ELSE (0) END))                                                                                                                                                                                                                                
                 |--Top(ROWCOUNT est 0)                                                                                                                                                                                                                                                                                                                                                           
                      |--Clustered Index Scan(OBJECT:([TstVera].[dbo].[_DocumentChngR12119].[_Docum12119_ByDataKey_RR] AS [T1]), WHERE:([TstVera].[dbo].[_DocumentChngR12119].[_NodeTRef] as [T1].[_NodeTRef]=[@P2] AND [TstVera].[dbo].[_DocumentChngR12119].[_NodeRRef] as [T1].[_NodeRRef]=[@P3] AND [TstVera].[dbo].[_DocumentChngR12119].[_MessageNo] as [T1].[_MessageNo] IS NULL) ORDERED) 


Вопрос:
1.Clustered Index Update - в данном случае обновляет все строки индекса ?
2. Скажите пожалуйста X блокировка при запросе текущего апдейта будет держаться до конца выполняющейся транзакции ?


Спасибо за внимание.

Сообщение было отредактировано: 10 июл 14, 16:24
10 июл 14, 16:20    [16287935]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с Clustered Index Update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
1. Обновит все строки, которые попали под условие выборки.
2. Любая x-блокировка держится до окончания транзакции.
10 июл 14, 16:25    [16287977]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с Clustered Index Update  [new]
Alex_MA
Member

Откуда: Вологда
Сообщений: 190
Гавриленко Сергей Алексеевич
1. Обновит все строки, которые попали под условие выборки.
2. Любая x-блокировка держится до окончания транзакции.


А как посмотреть какие строки попали под условия выборки.
Спасибо.
10 июл 14, 16:33    [16288031]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с Clustered Index Update  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Alex_MA,

заменить UPDATE на SELECT
10 июл 14, 16:34    [16288039]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с Clustered Index Update  [new]
msLex
Member

Откуда:
Сообщений: 9291
Alex_MA
Здравствуйте!

В 1С выполняется следующий оператор в транзакции:
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, 1);

В результате выполняется след. запрос:

exec sp_executesql N'UPDATE T1 SET _MessageNo = @P1
FROM _DocumentChngR12119 T1
WHERE T1._NodeTRef = @P2 AND T1._NodeRRef = @P3 AND T1._MessageNo IS NULL',N'@P1 numeric(10),@P2 varbinary(4),@P3 varbinary(16)',1,0x00008F99,0xAC39002264A3800E11E1AF1808102F86



План запроса следующий:
Картинка с другого сайта.

Текст плана:

StmtText                                                                                                                                                                                                                                                                                                                                                                                          
--------                                                                                                                                                                                                                                                                                                                                                                                          
Clustered Index Update(OBJECT:([TstVera].[dbo].[_DocumentChngR12119].[_Docum12119_ByDataKey_RR]), OBJECT:([TstVera].[dbo].[_DocumentChngR12119].[_Docum12119_ByNodeMsg_RNR]), SET:([TstVera].[dbo].[_DocumentChngR12119].[_MessageNo] = [@P1]))                                                                                                                                                   
  |--Compute Scalar(DEFINE:([Expr1012]=[Expr1012]))                                                                                                                                                                                                                                                                                                                                               
       |--Compute Scalar(DEFINE:([Expr1012]=CASE WHEN [Expr1002] THEN (1) ELSE (0) END))                                                                                                                                                                                                                                                                                                          
            |--Compute Scalar(DEFINE:([Expr1002]=CASE WHEN [TstVera].[dbo].[_DocumentChngR12119].[_MessageNo] as [T1].[_MessageNo] = [@P1] THEN (1) ELSE (0) END))                                                                                                                                                                                                                                
                 |--Top(ROWCOUNT est 0)                                                                                                                                                                                                                                                                                                                                                           
                      |--Clustered Index Scan(OBJECT:([TstVera].[dbo].[_DocumentChngR12119].[_Docum12119_ByDataKey_RR] AS [T1]), WHERE:([TstVera].[dbo].[_DocumentChngR12119].[_NodeTRef] as [T1].[_NodeTRef]=[@P2] AND [TstVera].[dbo].[_DocumentChngR12119].[_NodeRRef] as [T1].[_NodeRRef]=[@P3] AND [TstVera].[dbo].[_DocumentChngR12119].[_MessageNo] as [T1].[_MessageNo] IS NULL) ORDERED) 



Вопрос:
1.Clustered Index Update - в данном случае обновляет все строки индекса ?
2. Скажите пожалуйста X блокировка при запросе текущего апдейта будет держаться до конца выполняющейся транзакции ?


Спасибо за внимание.


На "физическом уровне" все будет работать так:

Перебирая записи кластерного индекса сервер для каждой из них будет:
1. Вешать U блокировку
2. Проверять соответствует ли запись критериям отбора.
3.а Если соответствует, конвертить U->X и изменять значение
3.б Если не соответствует, снимать U блокировку
10 июл 14, 16:39    [16288073]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить