oracle全文索引之幾個關鍵表

space6212發表於2019-03-14

oracle全文索引的原理是把對索引的查詢轉換成對幾個表的查詢。下面對幾個主要的表進行簡單介紹:


DR$INDEX_NAME$I:
該表的owner是基表所屬的schema。
這個表包含了所有的關鍵字和其對應的位置資訊。這是全文索引最主要的表,通常也是全文索引中最大的表。

Name Type
----------- ------------
TOKEN_TEXT VARCHAR2(64) --標識字元,也就是關鍵字。它是根據oracle根據索引對應的語法分析器生成的。
TOKEN_TYPE NUMBER(3)
TOKEN_FIRST NUMBER(10) --當前關鍵字(詞)對應的最小docid
TOKEN_LAST NUMBER(10) --當前關鍵字(詞)對應的最大docid
TOKEN_COUNT NUMBER(10) --關鍵字在當前docid範圍內有多少個滿足條件的docid
TOKEN_INFO BLOB --記錄關鍵字對應的位置資訊(估計記錄了關鍵字對應的DR$INDEX_NAME$R中ROW_NO資訊、關鍵字對應的DOCID)

DR$INDEX_NAME$K:
該表的owner是基表所屬的schema。
這個表主要對映docid和rowid的關係。docid是全文檢索的概念,它相當於表的一個條目。被全文檢索索引的每一行都對應一個docid,也就是說一個rowid對應一個docid。
它一般用於根據rowid,取docid的查詢。
Name Type
------- ----------
DOCID NUMBER(38)
TEXTKEY ROWID

DR$INDEX_NAME$R:
該表的owner是基表所屬的schema。
這個表主要用來完成根據docid查詢rowid的操作。這個表一般只有22行。
這個表的DATA欄位存的都是rowid,它是一個rowid的集合。由於rowid的長度都是固定的(18位),而docid是一個邏輯概念,它是根據序列順序增長的,所以可以根據這個讀取docid對應的rowid。
如doc=1時,取blob的前18位就是doc=1時對應的rowid;當docid=2時,取blob的19-36位就是docid=2對應的rowid。
docid=N時,其對應的rowid=Substr(DATA_ROWID,(N*18)+1,18) ,其中DATA_ROWID是根據DR$INDEX_NAME$R表的DATA欄位經過一定規則轉換的資料。(目前不清楚轉換規則)
為了避免DR$INDEX_NAME$R表中的單行長度太大,oracle在初始時把DR$INDEX_NAME$R分成了22行。這個數量是會變化的,如果資料量增長非常大,DR$INDEX_NAME$R的行數也會增多。

Name Type
------ ---------
ROW_NO NUMBER(3) --行號
DATA BLOB --儲存rowid集合

DR$INDEX_NAME$N:
該表的owner是基表所屬的schema。
這個表用來儲存被刪除的docid的資訊。在最佳化域索引時會使用並刪除這些資訊。
Name Type
--------- ----------
NLT_DOCID NUMBER(38) --docid
NLT_MARK CHAR(1) --N 表示新產生的無效docid;M表示正在被最佳化的docid

DR$PENDING:
該表的owner是基表所屬的ctxsys。
儲存insert和update操作產生的新資料。在索引同步時會被用到這些資料,同步完成後這些資料會被刪除。
在該表(PND_CID, PND_PID, PND_ROWID)組成一個主鍵。
Name Type
--------------- -------
PND_CID NUMBER --index_id
PND_PID NUMBER --這個不知道代表什麼?
PND_ROWID ROWID --對應記錄的rowid
PND_TIMESTAMP DATE
PND_LOCK_FAILED CHAR(1)

DR$WAITING:
該表的owner是基表所屬的ctxsys。
我們知道,表DR$DEPENDING的(PND_CID, PND_PID, PND_ROWID)必須唯一,而(PND_CID, PND_PID, PND_ROWID)唯一標識一個被插入或者更新的記錄。
當插入一條記錄後,會在DR$DEPENDING產生一條記錄。在沒有同步索引的情況下更新該記錄,也會產生一條記錄來記錄更新的資訊,其(PND_CID, PND_PID, PND_ROWID)是一樣的。為了不違反唯一性約束,後來的更新對應的資訊會記錄在DR$WAITING中。
如果對一個沒有被同步索引的記錄執行多次更新,會在DR$WAITING記錄多條資訊。
這個表主要用途是:
如果在索引同步的過程中修改了在DR$PENGDING中已經存在的記錄,由於同步還沒有完成DR$PENGDING中的記錄沒有被刪除,
所以,新的修改記錄的資訊不能插入到DR$PENGDING中,只能臨時放在DR$WAITING中。DR$WAITDING在這種情況下才有實際意義。
但實際上,在更新資料的時候,oracle並不會判斷是否有同步索引的任務在執行,它只是簡單地判斷被更新地記錄地資訊在DR$PENGDING是否存在,
如果存在,則把更新資訊放到DR$WAITING中,否則就放到DR$PENGDING中。
Name Type
--------- ------
WTG_CID NUMBER
WTG_ROWID ROWID
WTG_PID NUMBER

DR$DELETE:
該表的owner是基表所屬的ctxsys。
這個表比較有趣,它是一個IOT型別的表,但功能上類似與事務級臨時表(當執行commit後該表的記錄會被刪除)。
當使用者在一個會話刪除一條記錄時,在提交或者回滾前,會在DR$DELETE表插入一條記錄,標識某條記錄已經被刪除,這樣,在當前會話查詢被刪除的記錄將不會有結果返回(但在其他會話仍然能查詢到,因為其他表的資訊還沒有被修改,詳見下文描述);當會話提交事務,oracle會把DR$DELETE的記錄刪除。

Name Type
---------- ------
DEL_IDX_ID NUMBER --index_id
DEL_IXP_ID NUMBER
DEL_DOCID NUMBER --doc id

DR$INDEX
該表主要記錄域索引的相關資訊。

Name Type
------------------- -------------
IDX_ID NUMBER(38) --索引ID
IDX_OWNER# NUMBER
IDX_NAME VARCHAR2(30)
IDX_TABLE_OWNER# NUMBER
IDX_TABLE# NUMBER
IDX_KEY_NAME VARCHAR2(256)
IDX_KEY_TYPE NUMBER
IDX_TEXT_NAME VARCHAR2(256)
IDX_TEXT_TYPE NUMBER
IDX_TEXT_LENGTH NUMBER
IDX_DOCID_COUNT NUMBER --docid的數量
IDX_STATUS VARCHAR2(12)
IDX_VERSION NUMBER
IDX_NEXTID NUMBER
IDX_OPT_TOKEN VARCHAR2(64) --當次最佳化的起始關鍵字
IDX_OPT_TYPE NUMBER
IDX_OPT_COUNT NUMBER --當次最佳化的doc數量
IDX_LANGUAGE_COLUMN VARCHAR2(256)
IDX_FORMAT_COLUMN VARCHAR2(256)
IDX_CHARSET_COLUMN VARCHAR2(256)
IDX_TYPE NUMBER
IDX_OPTION VARCHAR2(40)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63755/,如需轉載,請註明出處,否則將追究法律責任。

相關文章