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

Откуда: Москва
Сообщений: 9634
msLex
В "нижней" ветки у вас sort. Это блокирующий оператор, и до его окончания нет смысле получать "верхний" поток.
Тогда почему это не так, когда на обоих входах есть блокирующие итераторы?
17 фев 21, 16:55    [22282370]     Ответить | Цитировать Сообщить модератору
 Re: Порядок блокировки таблиц не соответствует плану запроса  [new]
msLex
Member

Откуда:
Сообщений: 8716
invm
Тогда почему это не так, когда на обоих входах есть блокирующие итераторы?

а что происходит в случае двух блокирующих операторов?
каков порядок наложения блокировок?
17 фев 21, 17:16    [22282378]     Ответить | Цитировать Сообщить модератору
 Re: Порядок блокировки таблиц не соответствует плану запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9634
msLex,

+
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort, nocount on;
go

create table dbo.t1 (id int constraint PK_t1 primary key);
create table dbo.t2 (id int);

insert into dbo.t1 (id) values (1);
insert into dbo.t2 (id) values (2);

update statistics dbo.t1 with rowcount = 10000;
update statistics dbo.t2 with rowcount = 10000;

select 't1', %%lockres%%, id from dbo.t1;
select 't2', %%lockres%%, id from dbo.t2;
go

set statistics xml on;
dbcc traceon(1200, 3604, -1);
select
 t.id
from
 (
  select id from dbo.t1 with (repeatableread)
  union all
  select id from dbo.t2 with (repeatableread)
 ) t (id)
order by
 t.id
option
 (merge join);
dbcc traceoff(1200, 3604, -1);
set statistics xml off;

alter table dbo.t1 drop constraint PK_t1;
select 't1', %%lockres%%, id from dbo.t1;

print '';
print '----------------------------------------------------------------------';
print '';

set statistics xml on;
dbcc traceon(1200, 3604, -1);
select
 t.id
from
 (
  select id from dbo.t1 with (repeatableread)
  union all
  select id from dbo.t2 with (repeatableread)
 ) t (id)
order by
 t.id
option
 (merge join);
dbcc traceoff(1200, 3604, -1);
set statistics xml off;
go

drop table dbo.t1, dbo.t2;
go

Process 70 acquiring IS lock on OBJECT: 2:498816839:0  (class bit2000000 ref1) result: OK
Process 70 acquiring IS lock on OBJECT: 2:466816725:0 (class bit2000000 ref1) result: OK
Process 70 acquiring IS lock on PAGE: 2:4:224 (class bit2000000 ref0) result: OK
Process 70 acquiring S lock on RID: 2:4:224:0 (class bit2000000 ref0) result: OK
Process 70 acquiring IS lock on PAGE: 2:5:168 (class bit2000000 ref0) result: OK
Process 70 acquiring S lock on KEY: 2:4035225289354772480 (8194443284a0) (class bit2000000 ref1) result: OK
Process 70 releasing lock reference on KEY: 2:4035225289354772480 (8194443284a0)

Process 70 acquiring IS lock on OBJECT: 2:498816839:0 (class bit2000000 ref1) result: OK
Process 70 acquiring IS lock on OBJECT: 2:466816725:0 (class bit2000000 ref1) result: OK
Process 70 acquiring IS lock on PAGE: 2:5:168 (class bit2000000 ref0) result: OK
Process 70 acquiring S lock on RID: 2:5:168:0 (class bit2000000 ref0) result: OK
Process 70 acquiring IS lock on PAGE: 2:4:224 (class bit2000000 ref0) result: OK
Process 70 acquiring S lock on RID: 2:4:224:0 (class bit2000000 ref0) result: OK

17 фев 21, 19:08    [22282437]     Ответить | Цитировать Сообщить модератору
 Re: Порядок блокировки таблиц не соответствует плану запроса  [new]
Андрей_Батькович
Member

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

Спасибо вам большое за пример!

Еще раз убеждаюсь что поведение не очевидное, и больше похоже на недоработку.
Не вижу причин по которым нельзя было бы правый поток сделать первым на обработку (для конкатенации вроде порядок роли не играет), тогда и путаницы с чтением плана не было бы.
17 фев 21, 20:18    [22282488]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить