Oracle Text Index-part5-sync index

Oracle的CTX_DDL package包含了很多存储过程和函数用于创建和管理preference、section group、stoplists以及索引维护等。当创建全文索引的表中有新记录INSERT后,索引是没有更新的,所以需要对新记录的索引进行维护。正如在orace-text-index-part4-contains-query文中使用的execute ctx_ddl.sync_index(‘IDX1_T_LEXER’)是手动进行同步索引操作。
如果不想使用这种方式,可以使用选择commit后自动同步或者选择一定的间隔时间进行同步。

COMMIT后自动刷新

SQL> DROP INDEX IDX1_T_LEXER;

索引已删除。

SQL> CREATE INDEX IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC(ON COMMIT)');

索引已创建。

SQL> insert into t_lexer
  2    (id, create_date, DATA_ECHO_AREA)
  3  values
  4    (seq_t_lexer.nextval, sysdate, 'Text Index Testing');

已创建 1 行。

SQL> select score(99), id, create_date, dbms_lob.substr(DATA_ECHO_AREA) AREA
  2  from T_LEXER
  3  where contains(DATA_ECHO_AREA, 'testing', 99) > 0
  4  order by score(99) desc;

未选定行

SQL> COMMIT;

提交完成。

SQL> col area for a30
SQL> select score(99), id, create_date, dbms_lob.substr(DATA_ECHO_AREA) AREA
  2  from T_LEXER
  3  where contains(DATA_ECHO_AREA, 'testing', 99) > 0
  4  order by score(99) desc;

 SCORE(99)         ID CREATE_DATE         AREA
---------- ---------- ------------------- ------------------------------
         7         81 2017-01-22 14:45:45 Text Index Testing

间隔时间刷新

COMMIT后进行刷新的方式对于较少的UPDATE和INSERT操作来说影响相对不大,但是对于大表并且DML操作量也比较大的情况,这种方式就不理想了。因为这种方式会造成索引的碎片化而降低性能,比较好的方式是间隔一定的时间进行同步索引,比如每5分钟进行一次索引的同步。

SQL> DROP INDEX IDX1_T_LEXER;

索引已删除。

SQL> CREATE INDEX IDX1_T_LEXER ON T_LEXER(DATA_ECHO_AREA) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC(EVERY SYSDATE+5/1440)');

索引已创建。

SQL> insert into t_lexer
  2    (id, create_date, DATA_ECHO_AREA)
  3  values
  4    (seq_t_lexer.nextval, sysdate, 'Five Minutes');

已创建 1 行。

SQL>
SQL> COMMIT;

提交完成。

SQL> select sysdate from dual;

SYSDATE
-------------------
2017-01-22 15:02:52

SQL> select score(99), id, create_date, dbms_lob.substr(DATA_ECHO_AREA) AREA
  2  from T_LEXER
  3  where contains(DATA_ECHO_AREA, 'Five', 99) > 0
  4  order by score(99) desc;

未选定行

SQL> select sysdate from dual;

SYSDATE
-------------------
2017-01-22 15:07:53

SQL> select score(99), id, create_date, dbms_lob.substr(DATA_ECHO_AREA) AREA
  2  from T_LEXER
  3  where contains(DATA_ECHO_AREA, 'Five', 99) > 0
  4  order by score(99) desc;

 SCORE(99)         ID CREATE_DATE         AREA
---------- ---------- ------------------- ------------------------------
         7         82 2017-01-22 15:02:39 Five Minutes

存在索引的同步就需要进行索引的优化处理,对于全文索引,Oracle提供了OPTIMIZE_INDEX存储过程进行优化,文档中提到可以可以基于fast, full, rebuild, token, or token-type这5种模式进行索引的优化。
本文引用文档中的前三种:FAST,FULL和REBUILD。
“Fast mode compacts data but does not remove rows.

Full mode compacts data and removes rows.

Optimize in rebuild mode rebuilds the $I table (the inverted list table) in its entirety. Rebuilding an index is often significantly faster than performing a full optimization, and is more likely to result in smaller indexes, especially if the index is heavily fragmented.
Rebuild optimization creates a more compact copy of the $I table, and then switches the original $I table and the copy. The rebuild operation will therefore require enough space to store the copy as well as the original. (If redo logging is enabled, then additional space is required in the redo log as well.) At the end of the rebuild operation, the original $I table is dropped, and the space can be reused.”

针对文档中的描述,FAST方式相对后面2种来说,效果不是很大,FULL模式和REBUILD模式的好处比较明显,但是考虑到实际数据量的千差万别,可能需要我们针对实际的情况定制自己的模式选择和时间调度策略。比如每5分钟进行同步一次,业务相对空闲期(比如夜里)进行FULL模式或者REBUILD模式,亦或者夜里FULL模式,每7天进行REBUILD或者半个月REBUILD,当然方案的选择都是基于实际的数据量和业务的情况。

SQL> UPDATE T_LEXER SET DATA_ECHO_AREA = 'Shanghai is a city in the CHINA' WHERE ID = 3;

已更新 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT * FROM DR$IDX1_T_LEXER$N;

 NLT_DOCID N
---------- -
         5 U

SQL> execute ctx_ddl.optimize_index('IDX1_T_LEXER', 'FULL');

PL/SQL 过程已成功完成。

SQL> SELECT * FROM DR$IDX1_T_LEXER$N;   --remove rows

未选定行

对于调度方式的选择可以采用Oracle的scheduler进行。

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

One Response to Oracle Text Index-part5-sync index

  1. Pingback引用通告: Oracle Text Index-part6-preference and stoplist | LEO Notes

发表评论

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