如何根據儲存在每個頁面標題中的 m_objid 和 m_indexid 字段計算分配單元 id。
當 dbcc page 轉儲頁頭的內容時,它會進行必要的計算和元資料查詢,以便能夠告訴您分配單元 id、分割槽 id、關係物件 id 和關係索引 id。基本上,下面的 dbcc page 輸出中以「元資料:」為字首的所有內容都不會儲存在頁面本身上:
page @0x00000004ed8a2000m_pageid
= (1:445) m_headerversion =
1 m_type =
1m_typeflagbits
=0x0 m_level =
0 m_flagbits =
0xa000
m_objid (allocunitid.idobj)
=97 m_indexid (allocunitid.idind) =
256metadata: allocunitid
=72057594044284928
metadata: partitionid
=72057594039304192 metadata: indexid =
0metadata: objectid
=599673184 m_prevpage = (0:0) m_nextpage = (0:0
)pminlen
=8 m_slotcnt =
1 m_freecnt =
8069
m_freedata
=121 m_reservedcnt =
0 m_lsn = (225:443:22
)m_xactreserved
=0 m_xdesid = (0:0) m_ghostreccnt =
0m_tornbits
=0 db frag id =
1
公式如下:
使用上面的頁面:
a = 256 << 48 = 72057594037927936
b = 97 << 16 = 6356992
allocunitid = 72057594044284928
使用 sql server 使用power函式執行此操作,因為 x 位的左移與乘以 2 的冪次 x 相同:
select256*
convert (bigint, power (2.0, 48)) |97*
convert (bigint, power (2.0, 16));
然後您可以使用sys.system_internals_allocation_units和sys.partitions執行查詢,如下所示:
select[a].[container_id]as
[partition id],
[p].[object_id]as
[object id],
[p].[index_id]as
[index id
]from sys.system_internals_allocation_units [a]
join sys.partitions [p]
on[p].[
partition_id]=
[a].[container_id
]where[a
].[allocation_unit_id]=
72057594044284928;go
partition id object id
index
id--
------------------ ----------- -----------
72057594039304192
599673184
0
可以看到這些值與dbcc page輸出相匹配。
要將分配單元 id 轉換為在dbcc page輸出中看到的內容:
m_indexid = allocunitid >> 48
m_objid = ( allocunitid – ( m_indexid << 48)) >> 16
用於此的 t-sql 涉及浮點數學,因為我們需要使用power的倒數:
declare@alloc
bigint
=72057594044284928
;declare
@index
bigint
;select
@index
=convert (bigint
,convert (float, @alloc
)* (1
/power (2.0, 48)) --
right shift, reciprocal of left shift
);select
convert (bigint
,convert (float, @alloc
- (@index
*convert (bigint, power (2.0, 48
))))
* (1
/power (2.0, 16)) --
right shift, reciprocal of left shift
) as
[m_objid],
@indexas[
m_indexid];
gom_objid m_indexid
-------------------- --------------------
97256
這可以作為對dbcc checkdb無法處理的損壞資料庫進行程式設計分析期間,以允許你作為最後的手段提取資料。
SQL Server 分配單元
sql server 由乙個硬性的限制,乙個資料頁的資料不能超過8060bytes,如果乙個資料行的size超過這個限制,那麼該行的某些字段 在每乙個分割槽 partition 中,每乙個table都包含3種型別的資料,每個型別的資料都儲存在特定型別的資料頁集合 set of pages 中,每乙個...
雲計算 資源分配
在雲計算系統中所有的儲存 網路 記憶體 計算 io都是資源,這些資源都應該可以細粒度化分配。即網路,可以限定某乙個程序所可以使用的頻寬,可以現在某乙個會話的總頻寬,或者可以限制某乙個使用者的總頻寬,其他資源依次類似。儲存 對於儲存資源,為使用者分配定量的儲存資源。構建分布式檔案系統,監控使用者使用檔...
SQL Server的日期計算
a.乙個月的第一天 select dateadd mm,datediff mm,0,getdate 0 b.本週的星期一 select dateadd wk,datediff wk,0,getdate 0 c.一年的第一天 select dateadd yy,datediff yy,0,getdat...