ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle全文索引之几个关键表

oracle全文索引之几个关键表

原创 Linux操作系统 作者:space6212 时间:2019-03-14 08:45:04 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2005-01-25

  • 博文量
    245
  • 访问量
    168650