|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
Уважаемые коллеги, приветствую! Есть две таблицы, совершенно аналогичных по структуре, за исключением индексов и статистик. Обе - секционированные. Пытаюсь выполнить: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В процессе вставки load.USL лочится целиком, не смотря на то, что для нее стоит LOCK_ESCALATION = AUTO, да и подсказку PAGLOCK (от безысходности) уже используем. Секционирование ведется по полю regstamp, секций в такой insert попадает десятка 3, из 4000 возможных. Но лок получается на всю таблицу. В таблице load.ACT - нет ни индексов, ни статистик. Только кластерный индекс (не primary key!) по ID_ACT, regstamp. Почему так? Хочется, чтобы он лочил только те секции, которые указаны в диапазоне. В темповой таблице regstamp находится в том же диапазоне. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 12:45 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
Когда то давно и очень вскользь касался темы секционирования, потому просто предположение: т.к. у тебя секционирование по одному полю, а индекс и фильтрация по двум, то планировщик не может понять, что ID_ACT-ы надо искать только в тех секциях, которые фильтруются через regstamp BETWEEN 37000000 AND 37009999 и он пытается найти их в прочих секциях. Попробуй отрубить индекс для теста и посмотри что будет или замени на индекс только по regstamp. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 13:10 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster, план запроса приложить можете? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 13:16 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster Но лок получается на всю таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 18:35 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
alexeyvg, ну это не совсем "уровень гранулярности" но в целом да. если таблица секционирована то там возможно повышение до HoBT что можно считать увеличением до уровня секции ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 19:14 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
felix_ff uaggster, план запроса приложить можете? Вот так примерно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:12 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster, план надо выкладывать в формате .sqlplan здесь интересна не сама картинка плана а предположения оптимизатора какие он секции выбрал для исключения и кардинальность таблицы. у вас скорее всего срабатывает укрупнение блокировки по алгоритму достижения граничной планки кол-ва блокировок на объект для одной инструкции. посмотреть это кстати можно настроив xevent-сессиию на событие lock_escalation ну и сразу в догонку по мимо плана приложите еще результат: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:19 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
felix_ff , а если это так (не могу пока проверить), то что с этим можно поделать? Т.е., как оптимизатору сообщить, в каких секциях расположены данные? Точнее - будут располагаться данные? Одновременно вставляются данные не более, чем 30 секций из имеющихся 4000, обычно - 3-5. Обе таблицы построены на одной и той же функции секционирования. И, как мне кажется, я сообщаю оптимизатору, какие секции я собираюсь затронуть. Я же ограничиваю то поле, по которому производится секционирование в запросе явным образом! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 19:04 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster, хм... ну посмотрите сначала на Код: sql 1.
должно быть 2, если так то снимайте трассу/x-cобытие на lock_escalation и выкладываете сюда. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 22:08 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster Я же ограничиваю то поле, по которому производится секционирование в запросе явным образом! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 23:00 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
alexeyvg uaggster Я же ограничиваю то поле, по которому производится секционирование в запросе явным образом! ну предикат у него там на диапазон Код: sql 1.
а схема секционирования сопоставлена на колонку regstamp. Раз ТС божится что лочится вся таблица целиком а не HoBT, ставлю на то что у ТС на таблице окажется уровень lock_escalation = TABLE (ибо оно используется по умолчанию, если вручную не меняли) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 23:32 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
felix_ff alexeyvg пропущено... А как вы это делаете? ну предикат у него там на диапазон Код: sql 1.
а схема секционирования сопоставлена на колонку regstamp. Раз ТС божится что лочится вся таблица целиком а не HoBT, ставлю на то что у ТС на таблице окажется уровень lock_escalation = TABLE (ибо оно используется по умолчанию, если вручную не меняли) Да нет же! По обеим схемам у таблиц LOCK_ESCALATION = AUTO. Сейчас перепроверил, именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 05:52 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
felix_ff ну предикат у него там на диапазон Код: sql 1.
Запрос в топике демонстрационный, такой не может выполниться без ошибки. Нужно что то более приближенное к реальности. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:07 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
alexeyvg, ай точняк там же схемы разные. согласен отсечение секций результирующей таблицы тут никак не задать декларативно. но по сути даже, так у него при lock_escalation=auto на таблице load.USL должны лочится hobt - экслюзивно а сама таблица на IX uaggster, попробуйте убрать with(nolock) с таблицы act.USL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:20 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster, У меня все работает, см картинку. У вас какая версия? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:18 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
Вот такой: Microsoft SQL Server 2019 (RTM-CU7) (KB4570012) - 15.0.4063.15 (X64) Aug 15 2020 10:48:11 Copyright (C) 2019 Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor) Про CU7 уже прочитал. Вопрос: А если в темповой таблице создать констрейнт по regstamp - это может помочь? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 07:09 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster Вопрос: А если в темповой таблице создать констрейнт по regstamp - это может помочь? Либо ваш запрос/модель данных запрещают лок секций, либо сервер считает ,что для такого количество данных/секций блокировка таблиц эффективнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 07:50 |
|
Как заставить сервер блокировать только выбранные секции?
|
|||
---|---|---|---|
#18+
uaggster, я бы попробовал постепенно убирать из запроса "лишнее": - избавится от подсказок, глянуть, как будет работать - слить данные во времянку, а потом вставлять в целевую таблицу - попробовать поиграться с объемом вставляемых данных, чтобы найти границу, после которой изменяется модель блокирования ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 11:32 |
|
|
start [/forum/topic.php?fid=46&msg=40001444&tid=1685606]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 407ms |
0 / 0 |