Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 u[date 5000 записей  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1314
Добрый день всем.
Собеседовали тут
открыл для себя факт (не поверил бы )
но судял по гоглу так и есть

Update >5000 запией лочит таблицу

http://social.technet.microsoft.com/wiki/contents/articles/19870.sql-server-understanding-lock-escalation.aspx

1?) Вот думаю имеет ли это знание практ. примение
2?) Как увдитеть (словить) в SSMS сей момент

открыть транзакцию
и пустить update без коммита

SELECT * FROM sys.dm_tran_locks z
where  
z.request_session_id = @@SPID
3 окт 16, 18:31    [19738781]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4831
Гулин Федор,
А вот InMemory пофигу. Не залочит
3 окт 16, 18:43    [19738828]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37224
1. Раз в сервере сделали, значит имеет
2. В профайлере есть событие эскалации.
3 окт 16, 18:46    [19738842]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
invm
Member

Откуда: Москва
Сообщений: 9719
Гулин Федор
Как увдитеть (словить) в SSMS сей момент
use tempdb;
go

create table dbo.t (id int identity primary key, v int);
insert into dbo.t
select top (10000)
 1
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

begin tran;
update top (5000) dbo.t set v = 2
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go

begin tran;
update top (6250) dbo.t set v = 2
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go

drop table dbo.t;
go
3 окт 16, 19:05    [19738896]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1314
invm,
да СПС
и вот я смотрю не всегда 5000
дает лок таблицы
3 окт 16, 19:15    [19738933]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1314
a_voronin
Гулин Федор,
А вот InMemory пофигу. Не залочит


я вот думаю - речь то шла об таблицах уже созданных
и все равно я не до конца понял
репро-код приветствуется
3 окт 16, 19:17    [19738938]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
Гулин Федор
a_voronin
Гулин Федор,
А вот InMemory пофигу. Не залочит


я вот думаю - речь то шла об таблицах уже созданных
и все равно я не до конца понял
репро-код приветствуется

Тут скорее приветствуется 2014ый сервер Enterprise Edition в подарок,
можно деньгами.
Ну, чтоб репро воспроизвести. Сервер пускай воронин дарит, а ссылку на инмемори я дам безвозмездно, т.е. даром
4 окт 16, 08:06    [19740100]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Гулин Федор
invm,
да СПС
и вот я смотрю не всегда 5000
дает лок таблицы

эскалация опирается на статистику/индекс и 5к это очень приблизительный порог. Сервер сам :) решит если не ставить прямой запрет на эскалацию, и недавно столкнулся с тем что даже явно установленный уровень блокировки является чисто декларативным
4 окт 16, 09:04    [19740192]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
TaPaK
Гулин Федор
invm,
да СПС
и вот я смотрю не всегда 5000
дает лок таблицы

эскалация опирается на статистику/индекс и 5к это очень приблизительный порог. Сервер сам :) решит если не ставить прямой запрет на эскалацию, и недавно столкнулся с тем что даже явно установленный уровень блокировки является чисто декларативным

Чего?
Какая еще статистика /индекс?
Откройте статью БОЛ lock escalation,
5000локов на таблицу на стейтмент -- это в данном случае порог,
а пытается эскалировать по получении1250 новых локов, если предыдущая попытка неуспешная
4 окт 16, 09:32    [19740277]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,
use tempdb;
go

create table dbo.t (id int identity primary key, v int);
insert into dbo.t
select top (10000)
 1
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go
CREATE NONCLUSTERED INDEX x_IndT ON T(v)
GO
begin tran;
update top (3000) dbo.t  set v = 2 
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go

drop table dbo.t;
go
4 окт 16, 09:33    [19740282]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
TaPaK
o-o,
use tempdb;
go

create table dbo.t (id int identity primary key, v int);
insert into dbo.t
select top (10000)
 1
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go
CREATE NONCLUSTERED INDEX x_IndT ON T(v)
GO
begin tran;
update top (3000) dbo.t  set v = 2 
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go
надеетесь, что я 3000 + 3000 не умею складывать что ли?
6000 > 5000, эскалация сработала.
в чем прикол-то???

drop table dbo.t;
go
4 окт 16, 09:48    [19740325]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
invm
Member

Откуда: Москва
Сообщений: 9719
TaPaK
эскалация опирается на статистику/индекс и 5к это очень приблизительный порог
Эскалация опирается на суммарное число блокировок для конкретной таблицы, а не отдельного индекса и 5000 вполне себе точный документированный предел.
TaPaK
недавно столкнулся с тем что даже явно установленный уровень блокировки является чисто декларативным
Пример?
4 окт 16, 09:48    [19740331]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
блин, текст не вставился.
а зато заставили картинки 10 раз выбрать.
чтоб они по ночам снились тому, кто это г. придумал!!!
говорю,
надеетесь, что я 3000 + 3000 не умею складывать что ли?
6000 > 5000, эскалация сработала.
в чем прикол-то???
4 окт 16, 09:49    [19740334]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,

begin tran;
update top (6000) dbo.t  set v = 2 
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go

6000 > 5000?
4 окт 16, 09:54    [19740351]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Пример?


begin tran;
update dbo.t  WITH (ROWLOCK) set v = 2 
select resource_type, COUNT(*) from sys.dm_tran_locks where  request_mode = 'X' and request_session_id = @@spid GROUP BY resource_type
rollback;
go
4 окт 16, 10:02    [19740384]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
TaPaK
o-o,

begin tran;
update top (6000) dbo.t  set v = 2 
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go

6000 > 5000?

чего, снова пример invm копируем?
если на 5000 не эскалировал, вторая попытка будет на 6250, не на 6000
---
вы собираетесь или нет обосновывать свое утверждение о статистике?
4 окт 16, 10:02    [19740385]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o
TaPaK
o-o,

begin tran;
update top (6000) dbo.t  set v = 2 
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;
select count(*) from sys.dm_tran_locks where resource_type = 'OBJECT' and request_mode = 'X' and request_session_id = @@spid;
rollback;
go

6000 > 5000?

чего, снова пример invm копируем?
если на 5000 не эскалировал, вторая попытка будет на 6250, не на 6000
---
вы собираетесь или нет обосновывать свое утверждение о статистике?

количество блокировок будет зависеть от наличия индекса
4 окт 16, 10:18    [19740464]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
проверка, надо ли эскалировать, происходит каждые 1250 новых блокировок, ок?
вообще каждые 1250, не именно ваших 1250 в данном примере.
и когда *общее число* блокировок было 5000, это были не все *ваши*,
именно ваших было меньше,
эскалация не произошла.
следующая проверка будет, когда сервер наберет 6250 блокировок,
опять же не ваших, а вообще всех.
-----------
например, если на пустом сервер я запускаю ваш пример,
то при 6000
select count(*) from sys.dm_tran_locks where resource_type = 'KEY' and request_mode = 'X' and request_session_id = @@spid;

даст 6000,
но всего на сервере 6018 локов, их возвращает sp_lock.
ну так когда sp_lock возвращал 5000, из них ваших было меньше, наверное 4982,
не сработала эскалация.
а следующая попытка эскалации будет не когда вы наберете 5000,
а когда sp_lock вернет 6250.
при этом если найдется таблица с превышением 5000 на стейтменте, то сэскалирует
4 окт 16, 10:20    [19740476]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,
автор
даст 6000,
но всего на сервере 6018 локов, их возвращает sp_lock.
ну так когда sp_lock возвращал 5000, из них ваших было меньше, наверное 4982,
не сработала эскалация.
а следующая попытка эскалации будет не когда вы наберете 5000,
а когда sp_lock вернет 6250.
при этом если найдется таблица с превышением 5000 на стейтменте, то сэскалирует

звучит как-то запутано...

sp_lock для твоей сессии вернёт твои 5к блокировок твоей таблицы (ну если там ничего больше нет). Вот почему при прохождении 5к не случается эскалация при том что ничего ей не мешает?
4 окт 16, 10:40    [19740553]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
TaPaK
o-o,
автор
даст 6000,
но всего на сервере 6018 локов, их возвращает sp_lock.
ну так когда sp_lock возвращал 5000, из них ваших было меньше, наверное 4982,
не сработала эскалация.
а следующая попытка эскалации будет не когда вы наберете 5000,
а когда sp_lock вернет 6250.
при этом если найдется таблица с превышением 5000 на стейтменте, то сэскалирует

звучит как-то запутано...

sp_lock для твоей сессии вернёт твои 5к блокировок твоей таблицы (ну если там ничего больше нет). Вот почему при прохождении 5к не случается эскалация при том что ничего ей не мешает?

жопа какая-то.
почему sp_lock вернет для моей сессии-то?
ну выполните вы ето sp_lock,
неужели только одну сессию показывает-то?
4 окт 16, 10:46    [19740582]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,

EXEC sp_LOCK @@SPID
4 окт 16, 10:51    [19740615]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
TaPaK
Вот почему при прохождении 5к не случается эскалация при том что ничего ей не мешает?

вы понимаете различие между ВСЕГО НА СЕРВЕРЕ и на вашей таблице???
зачем вы в sp_lock передали спид???
ВСЕСЕРВЕРНО локи считаются!!!
-----
хорошо, пойдем абстрактно, детский сад.
в садике много групп, в каждой ребенок может заказать себе банный тазик.
когда число тазов на группу привысит 20, детей ведут в баню.
сервер -- это робот на входе, он при провозе любых 10 тазов проверяет,
не превышено ли число 20 для группы.
а в садике еще директорша, бух и зав.складом,
у них у каждой уже по тазику.
итого, счетчик на входе показывает: число тазов в саду 3.
теперь дети заказали себе 20 тазов, их вносят по одному.
когда счетчик тазов показал 10, проверили: в группе сколько тазов?
7! недобор.
следующий останов на 20 тазах.
сколько в группе тазов? 17!!! недобор.
итак, при заказе 20 тазов группу в баню не повели.
---
а если дети заказали 40 тазов? или даже 35? или 30? 27???
порог все тот же, 20, но проверка идет каждые 10.
начинаем сначала, в саду уже 3 таза (блокировки типа DB)
тазы заносят по одному.
на счете 10 останов. сколько в группе? 7. поехали дальше
на счете 20. в группе 17 -- недобор, пошли дальше.
на счете 30. в группе 27 тазов, это уже превысило 20, всех в баню!!!
4 окт 16, 11:01    [19740691]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,

гон какой-то
автор
укрупнение блокировки происходит только в том случае, если инструкция Transact-SQL получила не менее 5000 блокировок на одну ссылку таблицы

EXEC sp_lock даёт больше 5к блокировок на объект, на сервере никого, тазов больше чем достаточно, что мешало укрупнять при прохождении 5к?
4 окт 16, 11:25    [19740834]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
TaPaK
o-o,

гон какой-то
автор
укрупнение блокировки происходит только в том случае, если инструкция Transact-SQL получила не менее 5000 блокировок на одну ссылку таблицы

EXEC sp_lock даёт больше 5к блокировок на объект, на сервере никого, тазов больше чем достаточно, что мешало укрупнять при прохождении 5к?


Мешало то, что когда проходили 5к, из этих 5к на таблице было меньше. Как минимум была блокировка на БД.
4 окт 16, 11:29    [19740866]     Ответить | Цитировать Сообщить модератору
 Re: u[date 5000 записей  [new]
o-o
Guest
TaPaK
o-o,

гон какой-то
автор
укрупнение блокировки происходит только в том случае, если инструкция Transact-SQL получила не менее 5000 блокировок на одну ссылку таблицы

EXEC sp_lock даёт больше 5к блокировок на объект, на сервере никого, тазов больше чем достаточно, что мешало укрупнять при прохождении 5к?

да блин, сделайте же наконец картинку с вашими 5000 и с sp_lock БЕЗ ВСЯКОГО ЕМУ ПЕРЕДАННОГО СПИДА,
а то сделаю я
4 окт 16, 11:30    [19740870]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить