SQL Server 如何計算分配單元 ID?

2022-09-14 19:54:13 字數 2858 閱讀 6571

如何根據儲存在每個頁面標題中的 m_objid 和 m_indexid 字段計算分配單元 id。

當 dbcc page 轉儲頁頭的內容時,它會進行必要的計算和元資料查詢,以便能夠告訴您分配單元 id、分割槽 id、關係物件 id 和關係索引 id。基本上,下面的 dbcc page 輸出中以「元資料:」為字首的所有內容都不會儲存在頁面本身上:

page @0x00000004ed8a2000

m_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 相同:

select

256*

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...