使用对齐索引更新分区表会锁定所有分区

时间:2015-09-08 12:34:57

标签: sql-server sql-server-2008-r2 sql-server-2012 database-partitioning

部分功能和架构:

CREATE PARTITION FUNCTION SegmentPartitioningFunction (smallint)
    AS RANGE LEFT FOR VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ;
GO

CREATE PARTITION SCHEME SegmentPartitioningSchema
    AS PARTITION SegmentPartitioningFunction ALL TO ([PRIMARY])
GO

我有一张桌子(注意表格是M:N):

  PartTable 
  (
   prd_id int, 
   cat_id smallint, 
   datacolumn smallint,
   primary key (prd_id, cat_id) on SegmentPartitioningSchema(cat_id)
  ) on SegmentPartitioningSchema(cat_id)

注意:我尝试了所有3种组合(part. tablepart. indexpart table and index

此外,我有自己的PRD_IDCAT_ID索引,因为它们是Foreing键。

我将LOCK_ESCALATION设置为AUTO,并使用此选项确认:

SELECT lock_escalation_desc FROM sys.tables

现在,我想要做的是通过我的下层工作:

begin tran
update PartTable set DataColumn = DataColumn where cat_id = 1
-- commit tran -- this doesnt happen yet

并且同时处于不同的连接

begin tran
update PartTable set DataColumn = DataColumn where cat_id = 2
-- commit tran -- this doesnt happen yet

执行计划

Pastebin:http://pastebin.com/MgK6whYG

奖金问:为什么使用TOP运算符?

根据我的理解,我应该在分区上获得IX锁,同时只有一个分区,这意味着两个事务可以同时完成,第二个事务可以cat_id = 2不应该<39; t必须等待第一个,因为表和索引都被分区并且索引是对齐的。

然而,这并没有发生,当我检查执行计划时,我发现表扫描发生在每个分区上,即使这对我来说也没有意义。

我尝试了technetdocumentationstackoverflow,但我没有找到答案。 现在我知道PK应该是CAT_IDPRD_ID(这比使用表的方式更有意义)

我目前正在处理SQL Server 2012,但我认为它应该比2008R2更好。

0 个答案:

没有答案