Rozetka UA

Сколько записей можно обработать в одной транзакции MS SQL Server

Во время массовых операций над некой таблицей иногда возникает вопрос- сколько записей можно заапдейтить или удалить в одной транзакции без ущерба для производительности сервера. 10 или 100000 записей?

Это же и от режима работы сервера зависит, может  в текущий момент лучше вовсе не трогать?

Написал несложный скрипт lock_can_use

В чем логика- эскалация блокировок начинается с порога 40% отдоступного для них объема.

То есть, плясать нужно от того, чтобы количество обрабатываемых записей находилось на уровне 20%, не более. Если это сложный апдейт затрагивающий несколько записей- пропорционально снизить эту величину.

..проверено, работает.В отдельных случаях на отдельных серверах это количество измеряется шестизначной цифрой.

 

— Подсказка для массовых операций вставки-удаления.
— Как много записей можно обработать в одной транзакции без ущерба для производительности сервера.
— Предполагается, что при использовании не более 20% блокировок можно избежать эскалации блокировок.
— A hint for bulk insert-delete operations.
— How many records can be processed in a single transaction without sacrificing server performance.
— It is assumed that when using no more than 20% of locks, you can avoid escalating locks.
— Dmitry Gorchilin 20170503

select ‘ Lock Blocks Allocated/Lock Blocks, %’+
convert(varchar(30),100.*p2.cntr_value/p1.cntr_value)+
‘ 20% lock: ‘+
convert(varchar(30),p1.cntr_value/5)+
‘ Can use Lock:’+
convert(varchar(30),p1.cntr_value/5-p2.cntr_value)
FROM sys.dm_os_performance_counters p1,sys.dm_os_performance_counters p2
where p1.counter_name = ‘Lock Blocks Allocated’ and p2.counter_name = ‘Lock Blocks’

DECLARE @i INT
SELECT @i=p1.cntr_value/5-p2.cntr_value
FROM sys.dm_os_performance_counters p1,sys.dm_os_performance_counters p2
where p1.counter_name = ‘Lock Blocks Allocated’ and p2.counter_name = ‘Lock Blocks’
IF @i>0
BEGIN
SET ROWCOUNT @i
SELECT ‘ROWCOUNT=’+CONVERT (VARCHAR(30),@i)
—body of script
END
ELSE
BEGIN
SELECT ‘DO NOT RUN SCRIPT NOW!’
END
SET ROWCOUNT 0

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Pratik UaPratik UaPratik Ua