[20190706]行記錄是否記錄了各欄位在行位置的起始地址.txt
[20190706]行記錄是否記錄了各欄位在行位置的起始地址.txt
--//連結http://www.itpub.net/thread-2119080-1-1.html問的問題:
ORACLE 11204
ORACLE 在讀取某行記錄時,能否快速定位到某欄位在該行的位置(行記錄上記載了各欄位在該行的起始位置,可以快速定位)?
還是說,必須得讀取完前面的欄位值後,才能讀取到該欄位值?
比如:id1, id2 ,id3, (id4 CLOB), id5, id6,
我現在需要讀取 id5 在某行的值,是不是得把這行記錄的 id1 - id4的值都過一遍
(欄位值有結束位置,先找id1的結束位置,再找ID2的結束位置,,,),才能讀取到id5的值,
還是說,行記錄上也記載著 id5 在這行記錄上的起始位置,可以快速找到/定位到 id5 的起始位置?
若是後者,對於 CLOB 欄位型別,若是幾百,上千K,快把一個塊佔滿了,在讀取ID5之前,
得不斷地尋找ID4的結束位置,那豈不是很耗時間?
--//簡單解答一下:
行目錄記錄偏移位置,是相對偏移.從kdbh算起.
在資料部分記錄的格式是,前面還有3個位元組(flag,lock,clols(欄位數量,如果最後是NULL不計入),剩下
長度+內容+長度+內容+...
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
2.測試:
SCOTT@test01p> select rowid,emp.* from emp where rownum=1;
ROWID EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
AAAFfZAALAAAACUAAA 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
SCOTT@test01p> @ rowid AAAFfZAALAAAACUAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
22489 11 148 0 0x2C00094 11,148 alter system dump datafile 11 block 148
--//透過bbed觀察:
BBED> set dba 11,149
DBA 0x02c00095 (46137493 11,149)
--//windows下的bbed block存在+1的偏移.
BBED> map
File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
Block: 149 Dba:0x02c00095
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2 kdbr[14] @118
ub1 freespace[7475] @146
ub1 rowdata[567] @7621
ub4 tailchk @8188
--//檢視行目錄:
BBED> p kdbr
sb2 kdbr[0] @118 8050
sb2 kdbr[1] @120 8007
sb2 kdbr[2] @122 7964
sb2 kdbr[3] @124 7923
sb2 kdbr[4] @126 7878
sb2 kdbr[5] @128 7837
sb2 kdbr[6] @130 7796
sb2 kdbr[7] @132 7756
sb2 kdbr[8] @134 7718
sb2 kdbr[9] @136 7675
sb2 kdbr[10] @138 7637
sb2 kdbr[11] @140 7599
sb2 kdbr[12] @142 7560
sb2 kdbr[13] @144 7521
BBED> x /rnccntnnn *kdbr[0]
rowdata[529] @8150
------------
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0x01
cols@8152: 8
--//flag,lock,clols,還可以看出1個行片最多255個欄位.因為cols僅僅佔1個位元組.
col 0[3] @8153: 7369
col 1[5] @8157: SMITH
col 2[5] @8163: CLERK
col 3[3] @8169: 7902
col 4[7] @8173: 1980-12-17 00:00:00
col 5[2] @8181: 800
col 6[0] @8184: *NULL*
col 7[2] @8185: 20
--//注意看偏移=8150 ,與實際記錄存在100偏移(kdbh位置).
--//注意看NULL.沒有長度指示器,實際上僅僅佔1個位元組0xff表示NULL
BBED> dump offset 8184
File: D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF (11)
Block: 149 Offsets: 8184 to 8191 Dba:0x02c00095
----------------------------------------------------------------------
ff02c115 010604e9
<64 bytes per line>
--//資料部分: 長度+內容+長度+內容+...
--//可以看出如果訪問的欄位在後面訪問"越慢".
--//oracle並不記錄了各欄位在行位置的起始地址,僅僅在行目錄記錄開始位置.
--//如果欄位字元長度大於250,看連結http://blog.itpub.net/267265/viewspace-2148818/.
--//長度指示器佔2個位元組.
--//至於lob型別,我不熟悉不探究了.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2649742/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 地址記錄
- awk 中的欄位、記錄和變數變數
- 文章地址記錄
- 欄位修改記錄操作日誌的實現
- [20210618]記錄bash shell執行的命令.txt
- 透過DNS TXT記錄執行powershellDNS
- [20201204]為什麼返回2行記錄.txt
- 圓周率位數記憶記錄
- docker Linux 各種操作記錄DockerLinux
- Camstar MDB setfieldex 修改建模欄位不記錄Audit TrailAI
- sql根據多個欄位查詢重複記錄SQL
- python-進階教程-根據欄位將記錄分組Python
- [20201208]為什麼返回2行記錄補充.txt
- react記錄頁面的滾動條位置React
- [20220610]tmux記錄操作內容.txtUX
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- [20190130]刪除tab$記錄的恢復.txt
- [20211220]記錄使用sqlplus的小問題.txtSQL
- 20201215]記錄工作中的錯誤.txt
- fabric執行記錄
- 檢測表中行記錄是否已存在
- 更新一張與另一張表關聯的連線欄位記錄
- 記錄一下mysql多欄位排序遇到的一個好玩的現象MySql排序
- [20181219]記錄自己工作中的錯誤.txt
- 事業單位官網記錄
- 記錄一次因 mysql 欄位取名不規範導致的問題MySql
- chrome 歷史記錄 404的url地址 不會記錄 但是實際上可能有內容的Chrome
- 【Bioinfo Blog 014】【Shell】——亂七八糟各種各樣的命令記錄
- AndroidStudio中各種常見快捷鍵記錄Android
- fastadmin 新增欄位記圖片欄位AST
- 記錄
- [20190225]刪除tab$記錄的恢復5.txt
- [20190130]刪除tab$記錄的恢復2.txt
- [20190212]刪除tab$記錄的恢復3.txt
- [20211221]記錄使用sqlplus的小問題補充.txtSQL
- SQL INSERT INTO 語句詳解:插入新記錄、多行插入和自增欄位SQL
- PaperPig的記錄
- ThreadLocal原理記錄,別被坑了!!thread