Имя: Пароль:
1C
1С v8
Эскалация блокировок при удалении движений по регистратору или других DELETE
,
0 floody
 
22.12.15
11:48
Уважаемые эксперты, нужна ваша подсказка. Конфигурация упп1.3 на упр.блокировках.
Наблюдаю событие эскалации блокировок до уровня таблицы при данном запросе:

DELETE FROM T1
FROM _AccumRg21611 T1
WHERE T1._RecorderTRef = P1 AND T1._RecorderRRef = @P2

Насколько я понимаю, совсем не обязательно блокировать всю таблицу для удаления движений по одному регистратору.

Аналогичные запросы еще встречаются, вот пример:

DELETE FROM T4
FROM _Document417_VT10391 T4
WHERE _Document417_IDRRef = P1

Вопрос: в чем может быть проблема?
1 Господин ПЖ
 
22.12.15
11:50
блокировка на уровне скуля?

таблица слишком маленькая по объему - оптимизатору лень париться с записью
2 floody
 
22.12.15
11:50
Спросить у пользователя P1 - не предлагать)
3 floody
 
22.12.15
11:51
(1) Таблица _AccumRg21611 - самая большая в базе. 47млн записей и более 30 гигабайт на диске.
4 Господин ПЖ
 
22.12.15
11:54
не попадает в индекс
слишком много блокировок - оптимизатор задалбался рулить блокировками
5 floody
 
22.12.15
12:21
(4) индекс "Регистратор + НомерСтроки" всегда существует
про слишком много блокировок - это понятно, но не понятно, почему их много?
6 Господин ПЖ
 
22.12.15
12:24
>индекс "Регистратор + НомерСтроки" всегда существует

а кто сказал что он всегда используется? вполне "безобидный" запрос может давать table/index scan

смотри план выполнения
7 H A D G E H O G s
 
22.12.15
12:28
(6) Эскалация блокировок может быть не связана с планом. Ну тоесть, у него может быть православный indexseek и блокирована вся таблица.
8 Господин ПЖ
 
22.12.15
12:32
хуже от того что он посмотрит реальный план не станет. доп. информация не повредит
9 Apokalipsec
 
22.12.15
12:34
флаг трассировки 1224
10 floody
 
22.12.15
12:34
ушел смотреть план
11 vhl
 
22.12.15
12:35
(3) При большом количестве записей в одной транзацкии - эскалируется.
12 floody
 
22.12.15
12:39
(11) хорошо, например удаляются движения документа Требование-накладная (пускай из 1000 строк).

в итоге блокируем 47млн записей?
13 senior
 
22.12.15
12:41
(0) эскалацией можно управлять
14 Apokalipsec
 
22.12.15
12:42
(12) Скуль сам считает блокировки, и то что 1к строк не значит что это 1к блокировок, есть некий range на котором происходит эскалация блокировок на уровне субд. Ещё есть блокировки по памяти.
Поставьте флаг трассировки 1224, не будет эскалации по количеству блокировок, есть ещё флаг отвечающий за эскалацию по памяти, но им баловаться не рекомендую.
15 floody
 
22.12.15
12:48
(13)(14) Зачем баловаться флагами и пытаться управлять эскалацией? Я ведь не говорю, что скуль - дурачок и не нужно эскалировать блокировку. Однозначно эскалация - это добро. Иначе можно все ресурсы сервера положить на разруливание блокировок. А вот причина эскалации - это зло. Меня интересует - почему безобидная казалось бы операция по удалению движений одного документа приводит к блокировке таблицы в 30 гб.

(7)(8) Посмотрел план. Действительно - сканируется индекс по регистратору. В предикате: CONVERT_IMPLICIT(varchar(4),[database].[dbo].[_AccumRg21611].[_RecorderTRef] as [T1].[_RecorderTRef],0)='0x00000134' AND CONVERT_IMPLICIT(varchar(16),[database].[dbo].[_AccumRg21611].[_RecorderRRef] as [T1].[_RecorderRRef],0)='0x90160025904DA97E11E4D31107D43E91'

Что это? По этой информации можно понять, почему вместо поиска по индексу - сканирование?
16 H A D G E H O G s
 
22.12.15
13:07
(15) А P1 чему равен?
17 floody
 
22.12.15
13:12
P1 - тип регистратора, ну допустим ТН.
Р2 - сама ссылка.
18 H A D G E H O G s
 
22.12.15
13:17
(17) да я в курсе. Значение его какое. чему он равен?
19 Господин ПЖ
 
22.12.15
13:21
>По этой информации можно понять, почему вместо поиска по индексу - сканирование?

может статистика плохая
20 floody
 
22.12.15
13:29
(18) вот в этом запросе выше видно, что = 0x00000134
(19) статистика обновляется еженочно с фулл сканом
21 vhl
 
22.12.15
13:31
(12) Ну наверное в данном случае SQL выгоднее заблокировать одну таблицу чем наложить 1000 блокировок.
22 vhl
 
22.12.15
13:31
вон у Гилева почитай: http://www.gilev.ru/escalation/
23 floody
 
22.12.15
13:33
(19) есть вариант конечно, что нужно чаще обновлять.. например массовые перепроведения какие-то.
24 Господин ПЖ
 
22.12.15
13:42
с какой-то версии скуля при обновлении 20 000 записей стата сама рефрешится по таблице
25 floody
 
22.12.15
13:45
(24) с какой-то версии введен более интеллектуальный алгоритм определения порога автообновления.. с 2012 вроде. по % количеству от объема таблицы.
26 alexlap
 
22.12.15
13:45
А тип параметров varbinary или varchar?

N'@P1 varbinary(4),@P2 varbinary(16)'
В запросе так параметры заданы?
27 floody
 
22.12.15
13:49
(26) Это запрос, формируемый платформой при распроведении документа.

(@P1 varbinary(4),@P2 varbinary(16)) вот так