[20190910]索引分支塊中TERM使用什麼字元表示.txt

来源:https://www.cnblogs.com/lfree/archive/2019/09/10/11503366.html
-Advertisement-
Play Games

[20190910]索引分支塊中TERM使用什麼字元表示.txt--//做索引塊轉儲,一些root,分支節點出現TERM,從來沒有關註使用字元表示,簡單探究看看。1.環境:SCOTT@test01p> @ ver1PORT_STRING VERSION BANNER CON_ID IBMPC/WIN ...


[20190910]索引分支塊中TERM使用什麼字元表示.txt

--//做索引塊轉儲,一些root,分支節點出現TERM,從來沒有關註使用字元表示,簡單探究看看。

1.環境:
SCOTT@test01p> @ ver1

PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

SCOTT@test01p> create table t as select to_char(rownum,'FM'||lpad('0',20,'0')) v1 from dual connect by level<=2000;
Table created.

SCOTT@test01p> create index i_t_v1 on t(v1);
Index created.

SCOTT@test01p> select header_file,header_block from dba_segments where owner=user and segment_name='I_T_V1';
HEADER_FILE HEADER_BLOCK
----------- ------------
         11          506

SCOTT@test01p> @ treedump i_t_v1
old   1: select object_id from user_objects where object_name = upper('&&1') and object_type = 'INDEX'
new   1: select object_id from user_objects where object_name = upper('i_t_v1') and object_type = 'INDEX'
 OBJECT_ID
----------
     27931

old   1: alter session set events 'immediate trace name treedump level &m_index_id'
new   1: alter session set events 'immediate trace name treedump level      27931'
Session altered.        

2.檢查轉儲:
--//轉儲內容:
----- begin tree dump
branch: 0x2c001fb 46137851 (0: nrow: 9, level: 1)

*** 2019-09-10T20:55:45.660043+08:00 (TEST01P(3))
   leaf: 0x2c001fc 46137852 (-1: row:224.224 avs:832)
   leaf: 0x2c001fd 46137853 (0: row:224.224 avs:832)
   leaf: 0x2c001fe 46137854 (1: row:224.224 avs:832)
   leaf: 0x2c001ff 46137855 (2: row:224.224 avs:832)
   leaf: 0x2c003e0 46138336 (3: row:224.224 avs:832)
   leaf: 0x2c003e1 46138337 (4: row:224.224 avs:832)
   leaf: 0x2c003e2 46138338 (5: row:224.224 avs:832)
   leaf: 0x2c003e3 46138339 (6: row:224.224 avs:832)
   leaf: 0x2c003e4 46138340 (7: row:208.208 avs:1344)
----- end tree dump

--//0x2c001fb  = set dba 11,507 = alter system dump datafile 11 block 507
--//轉儲root節點.

SCOTT@test01p> alter system checkpoint ;
System altered.

SCOTT@test01p> alter system dump datafile 11 block 507;
System altered.

--//轉儲內容:
Block header dump:  0x02c001fb
 Object id on Block? Y
 seg/obj: 0x6d1b  csc:  0x0000000000a2b4d9  itc: 1  flg: E  typ: 2 - INDEX
     brn: 0  bdba: 0x2c001f8 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn  0x0000000000a2b4d9
Branch block dump
=================
header address 629538892=0x2586004c
kdxcolev 1
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 8
kdxcofbo 44=0x2c
kdxcofeo 7852=0x1eac
kdxcoavs 7808
kdxbrlmc 46137852=0x2c001fc
kdxbrsno 0
kdxbrbksz 8060
kdxbr2urrc 0
row#0[8034] dba: 46137853=0x2c001fd
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 32 35
--//30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 32 35 = 00000000000000000225
col 1; TERM
--//出現TERM.
row#1[8008] dba: 46137854=0x2c001fe
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 34 39
col 1; TERM
row#2[7982] dba: 46137855=0x2c001ff
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 37 33
col 1; TERM
row#3[7956] dba: 46138336=0x2c003e0
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 39 37
col 1; TERM
row#4[7930] dba: 46138337=0x2c003e1
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 32 31
col 1; TERM
row#5[7904] dba: 46138338=0x2c003e2
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 33 34 35
col 1; TERM
row#6[7878] dba: 46138339=0x2c003e3
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 36 39
col 1; TERM
row#7[7852] dba: 46138340=0x2c003e4
col 0; len 20; (20):  30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 37 39 33
col 1; TERM
----- end of branch block dump -----
End dump data blocks tsn: 4 file#: 11 minblk 507 maxblk 507

--//轉儲可以發現TERM,表示終結,也就是葉子節點並不需要保存完整鍵值,僅僅部分就ok了。
--//當然這裡看不出來TERM的對應編碼.看轉儲文件前面的內容如下:

Dump of memory from 0x0000000025860000 to 0x0000000025862000
025860000 0000A206 02C001FB 00A2B4DD 04010000  [................]
025860010 0000AFCD 00000002 00006D1B 00A2B4D9  [.........m......]
025860020 00008000 00320001 02C001F8 0000FFFF  [......2.........]
025860030 00000000 00000000 00000000 80008000  [................]
025860040 00A2B4D9 00000000 00000000 02800001  [................]
025860050 00000000 002C0008 1E801EAC 02C001FC  [......,.........]
025860060 00000000 00001F7C 1F481F62 1F141F2E  [....|...b.H.....]
025860070 1EE01EFA 1EAC1EC6 00000000 00000000  [................]
025860080 00000000 00000000 00000000 00000000  [................]
        Repeat 486 times
025861EF0 00000000 00000000 02C003E4 30303014  [.............000]
025861F00 30303030 30303030 30303030 39373130  [0000000000000179]
025861F10 03E3FE33 301402C0 30303030 30303030  [3......000000000]
025861F20 30303030 31303030 FE393635 02C003E2  [00000001569.....]
025861F30 30303014 30303030 30303030 30303030  [.000000000000000]
025861F40 34333130 03E1FE35 301402C0 30303030  [01345......00000]
025861F50 30303030 30303030 31303030 FE313231  [000000000001121.]
025861F60 02C003E0 30303014 30303030 30303030  [.....00000000000]
025861F70 30303030 39383030 01FFFE37 301402C0  [000000897......0]
025861F80 30303030 30303030 30303030 30303030  [0000000000000000]
025861F90 FE333736 02C001FE 30303014 30303030  [673......0000000]
025861FA0 30303030 30303030 34343030 01FDFE39  [0000000000449...]
025861FB0 301402C0 30303030 30303030 30303030  [...0000000000000]
025861FC0 30303030 FE353232 00000000 00000000  [0000225.........]
                   ~~~~~~~~
025861FD0 00000000 00000000 00000000 00000000  [................]
        Repeat 1 times
025861FF0 00000000 00000000 00000000 B4DD0601  [................]

--//註意看下劃線內容可以知道term對應編碼是0xfe.
--//當然我的例子特殊,如果上面的索引建立唯一索引就不會出現這樣的情況,因為這樣rowid在索引鍵值的前面。

3.bbed觀察看看:
BBED> set dba 11,508
        DBA             0x02c001fc (46137852 11,508)
--//註:windows下的bbed塊出現偏移要+1.

BBED> p kd_off
b2 kd_off[0]    @100      8060
b2 kd_off[1]    @102      0
b2 kd_off[2]    @104      8034
b2 kd_off[3]    @106      8008
b2 kd_off[4]    @108      7982
b2 kd_off[5]    @110      7956
b2 kd_off[6]    @112      7930
b2 kd_off[7]    @114      7904
--//bbed看索引結構有一些問題,kd_off[0],kd_off[1]指向的偏移不對.實際上從kd_off[2]開始.

BBED> x /rcx *kd_off[2]
rowdata[186]                                @8110
------------
child dba:     0x02c001fd
separator key:
col   0[20] @8115: 00000000000000000225
col    1[0] @8136: *TERM*

BBED> x /rcx *kd_off[3]
rowdata[160]                                @8084
------------
child dba:     0x02c001fe
separator key:
col   0[20] @8089: 00000000000000000449
col    1[0] @8110: *TERM*
---//這裡的偏移有問題.偏移8110是下一條記錄的開始,估計是bbed的bug.

BBED> dump /v offset 8110
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
 Block: 508                               Offsets: 8110 to 8191                            Dba:0x02c001fc
-----------------------------------------------------------------------------------------------------------
 fd01c002 14303030 30303030 30303030 30303030 30303232 35fe0000 00000000 l ??.00000000000000000225?.....
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 l ................................
 00000000 00000000 00000000 00000106 ddb4                                l ................荽
 <32 bytes per line>

BBED> x /rcx offset 8110
rowdata[186]                                @8110
------------
child dba:     0x02c001fd
separator key:
col   0[20] @8115: 00000000000000000225
col    1[0] @8136: *TERM*

BBED> dump /v offset 8109 count 2
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
 Block: 508                               Offsets: 8109 to 8110                            Dba:0x02c001fc
-----------------------------------------------------------------------------------------------------------
 fefd                                                                    l 
 <32 bytes per line>

--//bbed顯示的x命令顯示col 1的偏移有問題,實際上列長度是0.偏移8110是另一條記錄.
--//可以發現TERM實際上對應ASCII碼是0xfe。這樣就很好解析我以前遇到的問題。鏈接:
--//http://blog.itpub.net/267265/viewspace-1291526/=>[20141008]索引字元串的長度問題.txt

--//對於索引字元串的長度:
--//1.當字元串長度小於等於127時,使用1個位元組表示長度.
--//2.當字元串大於等於128時,使用2個位元組來保存長度,內容為字元串長度+0x8000.
--//3.真搞不懂為什麼與數據塊的保存方式不同,oracle要創造2種不同的方式保存字元串.

--//當時很不理解為什麼oracle要創造2種不同的方式保存字元串,現在明白了。

--//曾經寫過一篇"varchar2(4000)如何保存",鏈接如下:
--//http://blog.itpub.net/267265/viewspace-2148818/ => [20171218]varchar2(4000)如何保存.txt

--//如果一行能被存儲於一個數據塊(data block)中,那麼其行頭(row header)所需容量將不少於 3 位元組(byte)。在行頭信息之後依次儲存
--//的是各列的列長(column length)及列值(column value)。列長存儲於列值之前,如列值不超過250 位元組,那麼 Oracle使用1位元組存儲其
--//列長;如列值超過 250 位元組,則使用 3 位元組存儲其列長。列數據(column data)所需的存儲空間取決於此列的數據類型(datatype)。如
--//果某列的數據類型為變長(variable length)的,那麼存儲此列值所需的空間可能會隨著數據更新而增長或縮小。

--//當時的總結:
--//1.如果列值長度小於等於250位元組,Oracle使用1位元組存儲其列長.內容為欄位的長度.
--//2.如果列值長度超過250位元組,則使用3位元組存儲其列長。前面1個位元組使用0xfe(表示超過250),後面2個位元組表示列值長度.

--//很明顯0xfe在數據塊中的字元串長度指示器一部分,用來表示保存字元超過250位元組。而索引TERM使用0xfe表示。
--//這樣索引欄位字元串長度如果大於250,就不能再使用數據塊中類似的方式保存鍵值長度。這樣oraclea必須採用新的模式定義索引中字元串長度.
--//語言不好表達,還是通過例子說明:

4.繼續測試:
create table t1 (v1 varchar2(4000));
insert into t1 values (lpad('1',127,'1'));
insert into t1 values (lpad('2',128,'2'));
insert into t1 values (lpad('3',4000,'3'));
commit ;
create index i_t1_v1 on t1(v1);
alter system checkpoint ;

SCOTT@test01p> select header_file,header_block from dba_segments where owner=user and segment_name='I_T1_V1';
HEADER_FILE HEADER_BLOCK
----------- ------------
         11          410

--//索引根節點在11,411.通過bbed觀察:

BBED> set dba 11,412
        DBA             0x02c0019c (46137756 11,412)

BBED> p kd_off
b2 kd_off[0]  @132      8036
b2 kd_off[1]  @134      0
b2 kd_off[2]  @136      7899

BBED> x /rcx *kd_off[2]
rowdata[4154]                               @7999
-------------
flag@7999:     0x00 (NONE)
lock@8000:     0x00
data key:
col  0[127] @8002: 11111111...1111111111
col    1[6] @8130:  0x02  0xc0  0x01  0x95  0x00  0x00

BBED> dump /v offset 8001 count 10
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
 Block: 412                               Offsets: 8001 to 8010                            Dba:0x02c0019c
-----------------------------------------------------------------------------------------------------------
 7f313131 31313131 3131                                                  l .111111111
<32 bytes per line>

--//7f = 127 ,使用1個位元組表示字元串長度.

BBED> dump /v offset 138 count 4
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
 Block: 412                               Offsets:  138 to  141                            Dba:0x02c0019c
-----------------------------------------------------------------------------------------------------------
 501ea50e                                                                l P.?
<32 bytes per line>

--//位元組顛倒順序 0x1e50 = 7760, 0x0ea5 = 3749 .相對偏移在7760,3749,看前面kd_off[2]偏移可以看出絕對偏移要加100.

BBED> x /rcx offset 7860
rowdata[4015]                               @7860
-------------
flag@7860:     0x00 (NONE)
lock@7861:     0x00
data key:
col  0[128] @7864: 22222...22222
col    1[6] @7993:  0x02  0xc0  0x01  0x95  0x00  0x01

BBED> dump /v offset 7862 count 10
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
 Block: 412                               Offsets: 7862 to 7871                            Dba:0x02c0019c
-----------------------------------------------------------------------------------------------------------
 80803232 32323232 3232                                                  l ..22222222
<32 bytes per line>
--//出現2次0x80.

BBED> x /rcx offset 3849
rowdata[4]                                  @3849
----------
flag@3849:     0x00 (NONE)
lock@3850:     0x00
data key:
col 0[4000] @3853: 3333............
........3333333
col    1[6] @7854:  0x02  0xc0  0x01  0x95  0x00  0x02

BBED> dump /v offset 3851 count 10
 File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
 Block: 412                               Offsets: 3851 to 3860                            Dba:0x02c0019c
-----------------------------------------------------------------------------------------------------------
 8fa03333 33333333 3333                                                  l .?3333333
 <32 bytes per line>

--//0x8fa0 -0x8000 = 0xfa0 = 4000.

--//對於索引字元串的長度:
--//1.當字元串長度小於等於127時,使用1個位元組表示長度.
--//2.當字元串大於等於128時,使用2個位元組來保存長度,內容為字元串長度+0x8000.

--//以前學習oracle很不理解為什麼數據塊中字串長度小於等於250位元組,Oracle使用1位元組存儲其列長.內容為欄位的長度.
--//為什麼把邊界定義在250. 0xff用來保存空值,0xfe作為>250字串長度指示器編碼一部分(在索引表示TERM).
--//按照這樣的道理,oracle還預留了0xfb,0xfc,0xfd,不知道在那裡會用上....


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [toc] DHCP服務部署 一. 簡介     動態主機設置協議(英語:Dynamic Host Configuration Protocol,縮寫:DHCP)是一個用於區域網的網路協議,位於OSI模型的應用層,使用UDP協議工作。 二. 用途及功能 &nb ...
  • 目前在大部分公司內使用的台式機和部分伺服器都採用了Windows操作系統,而我麽都知道相當一部分病毒、惡意程式、黑客都是利用掃描埠號,利用開放的埠進行入侵,此時大型企業都會將伺服器的系統防火牆打開來關閉非常用埠。有些程式安裝後可能會自動添加開放需要用到的埠,而有些軟體則沒有這麼智能;又或者我 ...
  • 儘管RPM安裝方法能夠幫助用戶查詢軟體相關的依賴關係,但是還是需要安裝人員自己來解決,而且有些大型軟體可能與數十個程式都有依賴關係,在這種情況下安裝軟體事件非常痛苦和耗費事件的事情,而Yum軟體倉庫可以根據用戶的要求分析出所需軟體包及相互的依賴關係,然後自動從Yum源中下載、安裝到系統中。 RedH ...
  • windows遠程桌面連接預設使用的是3389埠,為了避免被他人掃描從而暴力破解遠程伺服器或者病毒入侵。可以將預設埠修改為其它埠,如8888,11111等。最好修改為10000以後的埠,這樣可以避免和系統內的其它程式埠衝突。 1、點擊【開始】菜單中的【運行】輸入regedit 2、在【註冊 ...
  • 這種情況加個SSL證書就行了 就是HTTPS協議 ...
  • ...
  • 本篇寫一些關於 網路相關的基礎命令、配置等。 hostname 1.查看主機名 2.臨時修改主機名 3.永久修改主機名 ifconfig 1.查看已啟用的網路介面信息 :第一塊乙太網卡的名稱。 中的 是`EtherNet s`表示熱插拔插槽上的設備 ,數字 表示插槽編號。 :迴環網路介面, 是`lo ...
  • 本文針對window操作系統與mysql8.0的版本。 1.mysql導出sql文件 這裡直接使用mysql提供的mysqlpump工具,以下是mysqlpump說明 mysqlpump客戶實用程式執行邏輯備份,產生一組能夠被執行以再現原始資料庫對象定義和表數據的SQL語句。它轉儲一個或多個MySQ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...