这篇文章介绍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
已选择6行。
上面的五张表都是全文索引生成的。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会将这些对象存放到默认表空间中,并根据默认表空间的存储参数设置这些对象的存储参数。
1 SQL SELECT 2 TABLE_NAME NAME, 3 DECODE 4 ( 5 IOT_TYPE, 6 ‘IOT’, 7 ( 8 SELECT TABLESPACE_NAME 9 FROM USER_INDEXES 10 WHERE TABLE_NAME = A.TABLE_NAME 11 AND INDEX_TYPE = ‘IOT – TOP’ 12 ), 13 TABLESPACE_NAME 14 ) TABLESPACE_NAME 15 FROM USER_TABLES A 16 WHERE TABLE_NAME LIKE ‘DR%’ 17 UNION ALL 18 SELECT INDEX_NAME NAME, TABLESPACE_NAME 19 FROM USER_INDEXES 20 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 已选择6行。 |
下面通过设置STORAGE属性,设置自动生成的表和索引的表空间属性:
SQL CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已创建。
SQL INSERT INTO T VALUES (1, ‘A simple example for storage.’);
已创建 1 行。
SQL COMMIT;
提交完成。
SQL CONN CTXSYS/CTXSYS@YANGTK
注意:这里是ctxsys登陆,登陆前一般需要解锁ctxsys用户/ alter user ctxsys account unlock;已连接。
1 SQL BEGIN 2 CTX_DDL.CREATE_PREFERENCE(‘TEST_WORDLIST_STORAGE’, ‘BASIC_WORDLIST’); 3 CTX_DDL.SET_ATTRIBUTE(‘TEST_WORDLIST_STORAGE’, ‘SUBSTRING_INDEX’, ‘TRUE’); 4 CTX_DDL.CREATE_PREFERENCE(‘TEST_STORAGE’, ‘BASIC_STORAGE’); 5 CTX_DDL.SET_ATTRIBUTE(‘TEST_STORAGE’, ‘I_TABLE_CLAUSE’, ‘TABLESPACE USERS’); 6 CTX_DDL.SET_ATTRIBUTE(‘TEST_STORAGE’, ‘K_TABLE_CLAUSE’, ‘TABLESPACE TOOLS’); 7 CTX_DDL.SET_ATTRIBUTE(‘TEST_STORAGE’, ‘R_TABLE_CLAUSE’, ‘TABLESPACE EXAMPLE’); 8 CTX_DDL.SET_ATTRIBUTE(‘TEST_STORAGE’, ‘N_TABLE_CLAUSE’, ‘TABLESPACE USERS’); 9 CTX_DDL.SET_ATTRIBUTE(‘TEST_STORAGE’, ‘P_TABLE_CLAUSE’, ‘TABLESPACE TOOLS’); 10 CTX_DDL.SET_ATTRIBUTE(‘TEST_STORAGE’, ‘I_INDEX_CLAUSE’, ‘TABLESPACE INDX’); 11 END; 12 / |
PL/SQL 过程已成功完成。
SQL CONN YANGTK/YANGTK@YANGTK已连接。 1 SQL CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT 2 PARAMETERS (‘WORDLIST CTXSYS.TEST_WORDLIST_STORAGE STORAGE CTXSYS.TEST_STORAGE’); |
索引已创建。
SQL SELECT 2 TABLE_NAME NAME, 3 DECODE 4 ( 5 IOT_TYPE, 6 ‘IOT’, 7 ( 8 SELECT TABLESPACE_NAME 9 FROM USER_INDEXES 10 WHERE TABLE_NAME = A.TABLE_NAME 11 AND INDEX_TYPE = ‘IOT – TOP’ 12 ), 13 TABLESPACE_NAME 14 ) TABLESPACE_NAME 15 FROM USER_TABLES A 16 WHERE TABLE_NAME LIKE ‘DR%’ 17 UNION ALL 18 SELECT INDEX_NAME NAME, TABLESPACE_NAME 19 FROM USER_INDEXES20 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 |
已选择6行。
通过查询看到,STORAGE属性的设置已经生效了。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
解决创建动态表时的PL/SQL错误
创建的表不会动态地出现在编译时(compile time)里。任何模式对象的静态引用都需要在编译时中进行验证。
-
关于PL/SQL中to_date和to_char函数的几点解读
在使用Oracle数据库中PL/SQL的to_date 和 to_char函数时需要注意哪些问题,专家Dan Clamage给出了一些提示。
-
有效的MySQL备份与恢复
如果您接手了一个MySQL生产系统,但不确定它是否运行了MySQL备份策略,这时需要做哪些保障措施呢?
-
找到Oracle数据库中性能最差的查询语句
“V$SQLAREA”和“ V$SQL”是非常有用的视图,在其中你可以查找发现执行效率最差的需要优化的SQL语句。