【问题标题】:Why Row Locks Exist on An Completely Empty Partition in SQL Server?为什么 SQL Server 中完全空的分区上存在行锁?
【发布时间】:2011-07-20 01:47:13
【问题描述】:

我创建了一个带有左范围函数的分区表。然后我将一些行插入到一个分区中。结果:

select partition_id, partition_number, rows from sys.partitions where object_id = object_id('ptest')

结果:

partition_id      partition_number rows
72057594464436224 1            8000
72057594464501760 2            0
72057594464567296 3            0
72057594464632832 4            0

然后我更新该表的一些行并查询 sys.dm_tran_locks,然后 我在 partition4 上找到一些 RID 锁,如下所示:

select * from sys.dm_tran_locks where resource_type = 'RID'

结果如下:

Resource_type Resource_description    
RID 3:13:192
RID 1:153496:257

当我使用 dbcc page 来验证页面 3:13 包含的内容时,我什么也得不到:

dbcc traceon(3604)
dbcc page(db, 3, 13, 3)

结果如下:

PAGE: (3:13)


BUFFER:


BUF @0x03E98BCC

bpage = 0x5A622000                   bhash = 0x00000000                   bpageno = (3:13)
bdbid = 11                           breferences = 0                      bUse1 = 38298
bstat = 0x1c0010b                    blog = 0x79797979                    bnext = 0x00000000

PAGE HEADER:


Page @0x5A622000

m_pageId = (3:13)                    m_headerVersion = 1                  m_type = 1
m_typeFlagBits = 0x4                 m_level = 0                          m_flagBits = 0xa008
m_objId (AllocUnitId.idObj) = 6973   m_indexId (AllocUnitId.idInd) = 256  
Metadata: AllocUnitId = 72057594494910464                                 
Metadata: PartitionId = 72057594464501760                                 Metadata: IndexId = 0
Metadata: ObjectId = 1967398128      m_prevPage = (0:0)                   m_nextPage = (0:0)
pminlen = 12                         m_slotCnt = 1                        m_freeCnt = 8094
m_freeData = 5867                    m_reservedCnt = 0                    m_lsn = (25294:376:199)
m_xactReserved = 0                   m_xdesId = (0:0)                     m_ghostRecCnt = 0
m_tornBits = -252731581              

Allocation Status

GAM (3:2) = ALLOCATED                SGAM (3:3) = ALLOCATED               
PFS (3:1) = 0x60 MIXED_EXT ALLOCATED   0_PCT_FULL                         DIFF (3:6) = CHANGED
ML (3:7) = NOT MIN_LOGGED   

因此,dbcc 页面确认页面 3:13 中没有任何内容。 我的问题来了,为什么文件 3:13 上存在 RID 锁,而那里什么都不存在

【问题讨论】:

  • 或者,问题也可以是这样的:为什么SQL Server在一个完全空的分区上分配页面?
  • 你也可以发布你的分区函数吗?
  • @JNK: CREATE PARTITION FUNCTION PFUNC (INT) AS RANGE LEFT FOR VALUES ( 1, 10000, 20000); GO
  • 一个普通的字段。这是一个有两列的堆表。 CREATE TABLE TEST(ID INT, _SEQNO INT IDENTITY(1, 1) ON PSCHEMA(ID)

标签: sql-server database-partitioning dbcc locks


【解决方案1】:

你的“我更新了这张表的一些行”T-SQL 是什么? 也许您的更新 T-SQL 使它被锁定。 这里不是什么都没有,空分区里还有页面但是没有数据

【讨论】:

  • 我用这个Update table set ID = ID + 1。我想知道为什么空分区有空页?
  • 我有 4 个分区 并且 DBCC IND 显示分区 1 中只有页面具有实际数据行,分区 4 中是最后一个分区,其中有 0 行。
猜你喜欢
  • 2011-12-31
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多