这篇文章介绍Oracle全文索引的STORAGE属性
Oracle全文索引的STORAGE属性是为了给全文索引生成的辅助表设置存储参数的
Oracle的全文索引会生成一张或多张辅助表由于这些表是Oracle自动生成的用户没有办法直接设置这些表和索引的物理参数因此Oracle提供了STORAGE属性专门设置这些辅助表和索引的物理参数
SQL SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID—————————— —— ———DR$IND_T_DOCS$I TABLEDR$IND_T_DOCS$K TABLEDR$IND_T_DOCS$N TABLEDR$IND_T_DOCS$P TABLEDR$IND_T_DOCS$R TABLET TABLE
已选择行
上面的五张表都是全文索引生成的CONTEXT索引生成表的规则是DR$+索引名+$+表用途标识
DR$IND_T_DOCS$I存储的是索引数据表(Index data table);
DR$IND_T_DOCS$K存储的是键值映射表(Keymap table);
DR$IND_T_DOCS$R是ROWID表(Rowid table);
DR$IND_T_DOCS$N是负键值链表(Negative list table);
DR$IND_T_DOCS$P这个表只有在CONTEXT索引中设置BASIC_WORDLIST的SUBSTRING_INDEX属性后才会生成用来保存单词的部分内容
DR$IND_T_DOCS$X这个索引是DR$IND_T_DOCS$I表的索引
SQL SELECT TABLE_NAME INDEX_NAME FROM USER_INDEXES WHERE INDEX_NAME LIKE DR%;
TABLE_NAME INDEX_NAME—————————— ——————————DR$IND_T_DOCS$I DR$IND_T_DOCS$X
如果不进行设置那么Oracle会将这些对象存放到默认表空间中并根据默认表空间的存储参数设置这些对象的存储参数
SQL SELECT
TABLE_NAME NAME
DECODE
(
IOT_TYPE
IOT
(
SELECT TABLESPACE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = ATABLE_NAME
AND INDEX_TYPE = IOT TOP
)
TABLESPACE_NAME
) TABLESPACE_NAME
FROM USER_TABLES A
WHERE TABLE_NAME LIKE DR%
UNION ALL
SELECT INDEX_NAME NAME TABLESPACE_NAME
FROM USER_INDEXES
WHERE INDEX_NAME LIKE DR%;
NAME TABLESPACE_NAME—————————— ———————DR$IND_T_DOCS$I YANGTKDR$IND_T_DOCS$K YANGTKDR$IND_T_DOCS$N YANGTKDR$IND_T_DOCS$P YANGTKDR$IND_T_DOCS$R YANGTKDR$IND_T_DOCS$X YANGTK
已选择行
下面通过设置STORAGE属性设置自动生成的表和索引的表空间属性
SQL CREATE TABLE T (ID NUMBER DOCS VARCHAR());
表已创建
SQL INSERT INTO T VALUES ( A simple example for storage);
已创建 行
SQL COMMIT;
提交完成
SQL CONN CTXSYS/CTXSYS@YANGTK
注意这里是ctxsys登陆登陆前一般需要解锁ctxsys用户/ alter user ctxsys account unlock;已连接
SQL BEGIN
CTX_DDLCREATE_PREFERENCE(TEST_WORDLIST_STORAGE BASIC_WORDLIST);
CTX_DDLSET_ATTRIBUTE(TEST_WORDLIST_STORAGE SUBSTRING_INDEX TRUE);
CTX_DDLCREATE_PREFERENCE(TEST_STORAGE BASIC_STORAGE);
CTX_DDLSET_ATTRIBUTE(TEST_STORAGE I_TABLE_CLAUSE TABLESPACE USERS);
CTX_DDLSET_ATTRIBUTE(TEST_STORAGE K_TABLE_CLAUSE TABLESPACE TOOLS);
CTX_DDLSET_ATTRIBUTE(TEST_STORAGE R_TABLE_CLAUSE TABLESPACE EXAMPLE);
CTX_DDLSET_ATTRIBUTE(TEST_STORAGE N_TABLE_CLAUSE TABLESPACE USERS);
CTX_DDLSET_ATTRIBUTE(TEST_STORAGE P_TABLE_CLAUSE TABLESPACE TOOLS);
CTX_DDLSET_ATTRIBUTE(TEST_STORAGE I_INDEX_CLAUSE TABLESPACE INDX);
END;
/
PL/SQL 过程已成功完成
SQL CONN YANGTK/YANGTK@YANGTK已连接
SQL CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYSCONTEXT
PARAMETERS (WORDLIST CTXSYSTEST_WORDLIST_STORAGE STORAGE CTXSYSTEST_STORAGE);
索引已创建
SQL SELECT
TABLE_NAME NAME
DECODE
(
IOT_TYPE
IOT
(
SELECT TABLESPACE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = ATABLE_NAME
AND INDEX_TYPE = IOT TOP
)
TABLESPACE_NAME
) TABLESPACE_NAME
FROM USER_TABLES A
WHERE TABLE_NAME LIKE DR%
UNION ALL
SELECT INDEX_NAME NAME TABLESPACE_NAME
FROM USER_INDEXES WHERE INDEX_NAME LIKE DR%;
NAME TABLESPACE_NAME—————————— ——————————DR$IND_T_DOCS$I USERSDR$IND_T_DOCS$K TOOLSDR$IND_T_DOCS$N USERSDR$IND_T_DOCS$P TOOLSDR$IND_T_DOCS$R EXAMPLEDR$IND_T_DOCS$X INDX
已选择行
通过查询看到STORAGE属性的设置已经生效了