部分功能和架构:
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. table
,part. index
,part table and index
)
此外,我有自己的PRD_ID
和CAT_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必须等待第一个,因为表和索引都被分区并且索引是对齐的。
然而,这并没有发生,当我检查执行计划时,我发现表扫描发生在每个分区上,即使这对我来说也没有意义。
我尝试了technet
,documentation
和stackoverflow
,但我没有找到答案。
现在我知道PK
应该是CAT_ID
,PRD_ID
(这比使用表的方式更有意义)
我目前正在处理SQL Server 2012
,但我认为它应该比2008R2
更好。