sqlserver2000提供了乙個讀取資料頁結構的命令dbcc page。該命令為非文件化的命令,具體如下:
dbcc page (,filenum,pagenum[,printopt])
具體引數描述如下:
dbid 包含頁面的資料庫id
dbname 包含頁面的資料庫的名稱
filenum 包含頁面的檔案編號
pagenum 檔案內的頁面
printopt 可選的輸出選項;選用其中乙個值:
0:預設值,輸出緩衝區的標題和頁面標題
1:輸出緩衝區的標題、頁面標題(分別輸出每一行),以及行偏移量表
2:輸出緩衝區的標題、頁面標題(整體輸出頁面),以及行偏移量表
3:輸出緩衝區的標題、頁面標題(分別輸出每一行),以及行偏移量表;每一行
後跟分別列出的它的列值
要想看到這些輸出的結果,還需要設定dbcc traceon(3604)。
對於表來說,它所在的dbid或者dbname很容易知道,那麼它的filenum和pagenum怎麼知道呢?其實這個值存在系統表sysindexes的列first中(當indid為0或者1時,indid為0表示該表是乙個堆表,沒有任何聚集索引,indid為1表示該索引為聚集索引),列first的資料型別為binary(6),它是以16進製制的形式儲的,需要進行轉換。在16進製制中,每兩個16進製制數字表示乙個位元組,並且是逆序排列的。比如假設乙個表的first的值為0xc70000000100,怎麼轉換呢?因為它是逆序排列的,並且每兩個表示乙個位元組,所以每次都將剩下first值的最後兩位移到轉換後資料的最後,具體轉換步驟如下:
步驟 此時的first值 轉換後的資料
第0步 0xc70000000100
第1步 0xc700000001 00
第2步 0xc7000000 0001
第3步 0xc70000 000100
第4步 0xc700 00010000
第5步 0xc7 0001000000
第6步 0x 0001000000c7
此時轉換完成。資料0001000000c7即是我們需要的資料,其中它的前2組數(即0001)表示該錶所在的檔案編號;後4組(000000c7)表示該錶所在的頁碼(注意該資料還要轉換為10進製的數才能具體知道是多少)。
完整的**如下(將設我們要檢視的是表test的資料頁的結構):
--從sysindexes中取出first的值
declare @first binary(6)
select @first = first from sysindexes where id = object_id('test') and indid in(0,1)
declare @pagenum int
select @pagenum = convert(int, substring(@first,4,1) + substring(@first,3,1) +
substring(@first,2,1) + substring(@first,1,1) )
declare @filenum int
select @filenum = convert(int, substring(@first,6,1) + substring(@first,5,1))
select @filenum, @pagenum
--執行dbcc page
declare @sql varchar(1000)
select @sql = 'dbcc page (''' + db_name() + ''', ' + convert(varchar(10),@filenum) + ', ' +
convert(varchar(10),@pagenum) + ', 1)'
select @sql
dbcc traceon(3604)
exec (@sql)
執行完上面的語句,就可以檢視表test的資料頁了。怎麼讀懂這些輸出結果呢?
dbcc page的輸出主要分為5個部分: page、buffer、page hearder、data、offset table(行的偏移量陣列)。
page指出該錶的檔案編號及頁碼。
buffer指出關於給定頁面的緩衝區的資訊。
page header指出頁面中所有標題欄位的資料。
data指出每一行的資訊。對於每一行,dbcc page指出行在槽中的位置,以及該行在頁面中的偏移量。頁面資料被分成3部分,左列指出的是所顯示的資料在行中的位元組位置。接著4列包含頁面儲存的實際資料,以16進製制的形式顯示。右列包含資料的字元表示(只有字元資料是可讀的)。
offset table指出頁面末尾的行偏移量陣列的內容。注意這裡並不是行物理儲存的順序,而是以槽的編號的順序來顯示的,不過這裡可以通過槽的編號看出它的物理儲存順序,比如槽的編號最小的為物理儲存的第一行,依此類推。
mysql檢視表結構的幾種方式
在我第n次忘記如何檢視表結構後,在網上查了一下後,看到有好幾種檢視表結構的方式,總結一下。以student sid,sname,birthday,的檢視為例。方式一 desc student 語法 desc 表名 用於檢視表整體結構 方式二 describe student 語法 describe ...
方法結構Oracle檢視表結構的幾種方法
新手發帖,很多方面都是剛入門,有錯誤的地方請大家見諒,歡迎批評指正 1,describe 命令 使用方法如下 sql describe nchar tst nchar tst為表名 顯示的結果如下 名稱 是否為空?型別 name nchar 6 addr nvarchar2 16 sal numbe...
mysql 檢視表的型別
mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innodb myisam 預設的mysql外掛程式式儲存引擎,它是基於isam型別,但它增加了許多有用的擴充套件,它是在web 資料倉儲和其他應用環境下最常使用的儲存引擎之一。注意,通過更改stora...