Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Блокировки по ключу sys.partitions  [new]
Тимур З
Member

Откуда:
Сообщений: 59
Всем привет!
Выполняется вставка в секционированную таблицу.
begin tran
  truncate table table1

  insert table1( id, [count] )
    select id, count( distinct [user_id] ) as [count]
    from table2 with (nolock)
    where [date] >= dateadd( month, -1, @date )
      and [date] < @date
    group by id
 
commit

Блокировки sp_lock:
spid	dbid	ObjId	IndId	Type	Resource	Mode	Status
84	5	5	1	KEY	(ba6aed7721ea)  X	GRANT

Параллельно пытаюсь определить последнюю секцию в другой таблице
select * from sys.partitions where object_id = object_id( 'table3' )

Второй запрос лочится
spid	dbid	ObjId	IndId	Type	Resource	Mode	Status
66	5	5	1	KEY	(ba6aed7721ea)   S	WAIT

Причем вариант
select * from sys.partitions where partition_id in ( select partition_id from sys.partitions with(nolock) where object_id = object_id( 'table3') )

Работает - видимо блокировка на индексе по полю object_id?
Как надежно определить partition_number последней секции в table3 в такой ситуации?
22 окт 12, 10:51    [13354973]     Ответить | Цитировать Сообщить модератору
 Re: Блокировки по ключу sys.partitions  [new]
Тимур З
Member

Откуда:
Сообщений: 59
if object_id('dbo.test') is not null
  drop table dbo.test
go
create table dbo.test(id int)
go
insert dbo.test(id)
select 1

begin tran

truncate table dbo.test
insert dbo.test(id)
select 1


Сделал тест - после запуска это скрипта
второй скрипт заблокирован:
select * from sys.partitions where object_id = object_id('dbo.test2') 
22 окт 12, 12:53    [13355979]     Ответить | Цитировать Сообщить модератору
 Re: Блокировки по ключу sys.partitions  [new]
Тимур З
Member

Откуда:
Сообщений: 59
Решил отказаться от транзакции и truncate заменить на переключение секции в промежуточную таблицу, затем если процедура упадет - обратно буду переключать.
if object_id('dbo.test') is not null
  drop table dbo.test
go
if object_id('dbo.test2') is not null
  drop table dbo.test2
go
create table dbo.test(id int)
go
create table dbo.test2(id int)
go
insert dbo.test(id)
select 1

alter table dbo.test switch partition 1 to dbo.test2 partition 1

insert dbo.test(id)
select 1
22 окт 12, 13:01    [13356037]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить