Orace Text Index-part7-Memory parameter

创建Text Index的时候,在将in-memory中的token表和mapping表的内容写到DR前缀的表之前,Text Index生成的TOKEN信息是cache在内存中的。从cache中写出到物理磁盘上后再次生成新的token信息和mapping信息保存在内存中,这样反复进行直到完成Text Index的创建,其中控制cache多少数据由memory相关参数来决定,所以在创建Text Index的时候分配的memory参数就很重要了。
Oracle建议将参数设置的越大越好,一方面可以加速创建的过程,另一方面可以减少最终INDEX的碎片化,但是太大了也会造成swapping,并且越大的设置也就相应的需要更多的资源来完成回滚。
关于Text Index memory的系统参数包括DEFAULT_INDEX_MEMORY和 MAX_INDEX_MEMORY,在CREATE TEXT INDEX的时候也可以指定memory参数来定义使用的内存大小,文中的测试部分使用指定memory参数大小的方式进行了对比。

Text Index的参数可以通过查询CTX_PARAMETERS视图来获得。

11.2.0.4环境的输出
SQL> SELECT PAR_NAME, PAR_VALUE / 1024 / 1024
  2    FROM CTXSYS.CTX_PARAMETERS
  3   WHERE PAR_NAME IN ('DEFAULT_INDEX_MEMORY', 'MAX_INDEX_MEMORY');

PAR_NAME                       PAR_VALUE/1024/1024
------------------------------ -------------------
DEFAULT_INDEX_MEMORY                            12       --12M
MAX_INDEX_MEMORY                              1024      --1024M

12.1.0.2和12.1.0.1的输出
SQL> SELECT PAR_NAME, PAR_VALUE / 1024 / 1024
  2    FROM CTXSYS.CTX_PARAMETERS
  3   WHERE PAR_NAME IN ('DEFAULT_INDEX_MEMORY', 'MAX_INDEX_MEMORY');
PAR_NAME                       PAR_VALUE/1024/1024
------------------------------ -------------------
DEFAULT_INDEX_MEMORY                            64        --64M
MAX_INDEX_MEMORY                            262144       --256G

增大MAX_INDEX_MEMORY参数和DEFAULT_INDEX_MEMORY可以通过使用ctxsys用户的ctx_adm包

begin
 ctxsys.ctx_adm.set_parameter('MAX_INDEX_MEMORY','1024M');
 ctxsys.ctx_adm.set_parameter('DEFAULT_INDEX_MEMORY','512M');
end;
/

测试下memory参数对Text Index的创建效率和对应情况下生成的TOKEN表大小的影响。
测试环境为Linux 11.2.0.4文件系统非归档模式,开启异步IO,CLOB内数据格式比较复杂,CLOB列的大小大概是4539.8M,创建Text Index开启并行度为4。
测试脚本:

SET TIMING ON
SET SERVEROUTPUT ON
DROP INDEX IDX1_T_LEXER;
CREATE INDEX  IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER MYLEX STOPLIST MY_STOPLIST MEMORY 64M') PARALLEL 4;
select segment_name,bytes/1024/1024 from user_segments where segment_name like 'DR%';

DROP INDEX IDX1_T_LEXER;
CREATE INDEX IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER MYLEX STOPLIST MY_STOPLIST MEMORY 128M') PARALLEL 4;
select segment_name,bytes/1024/1024 from user_segments where segment_name like 'DR%';

DROP INDEX IDX1_T_LEXER;
CREATE INDEX IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER MYLEX STOPLIST MY_STOPLIST MEMORY 256M') PARALLEL 4;
select segment_name,bytes/1024/1024 from user_segments where segment_name like 'DR%';

DROP INDEX IDX1_T_LEXER;
CREATE INDEX IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER MYLEX STOPLIST MY_STOPLIST MEMORY 512M') PARALLEL 4;
select segment_name,bytes/1024/1024 from user_segments where segment_name like 'DR%';

DROP INDEX IDX1_T_LEXER;
CREATE INDEX IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER MYLEX STOPLIST MY_STOPLIST MEMORY 1024M') PARALLEL 4;
select segment_name,bytes/1024/1024 from user_segments where segment_name like 'DR%';

测试结果如下:

MEMORY参数设置 DR$IDX1_T_LEXER$I大小(MB) DR$IDX1_T_LEXER$X大小(MB) 创建使用时间(seconds)
64M 4781 1833 4443.189
128M 4582 1769 3594.388
256M 4439 1698 3017.122
512M 4295 1634 1932.463
1024M 4025 1563 2089.415

FOOTNOTE:
2017.2.27 增加被创建列的CLOB大小,使用ROUND(DBMS_LOB.GETLENGTH(DATA_ECHO_AREA) / 1024, 2)计算大小为4539.8 MB。

此条目发表在Domain Index, index, LOB分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s