2009-12-16 61 views
9

我們希望使用ctxsys.context索引類型進行全文搜索。但我很驚訝,這種類型的索引不會自動更新。我們有300萬份文件,每天大約有10K次更新/插入/刪除。如何同步和優化Oracle文本索引?

對於同步和優化Oracle Text索引,您有什麼建議?

+0

你有什麼跡象表明索引不會保持同步? – dpbradley 2009-12-16 18:10:56

+0

這些類型的工具對於您的特定需求不做任何假設是很常見的。對大量非結構化數據創建和維護索引通常需要一些考慮因素,以便您的設計選擇產生可接受的折衷解決方案。搜索引擎的更新和維護策略可能與協作式創作解決方案有很大不同,後者採用支持分析的appart形式。 Oracle爲您提供了一個小範圍的同步選項供您選擇,而每日只有10k的DML可能會讓您失去其中的任何一個。 – Roy 2016-09-05 18:38:51

回答

3

我認爲'SYNC EVERY'選項,如先前答案中所述,僅在Oracle 10g或更新版本中可用。如果您使用的是較舊版本的Oracle,則必須定期運行同步操作。例如,您可以創建以下存儲過程:

CREATE OR REPLACE 
Procedure sync_ctx_indexes 
IS 
CURSOR sql1 is select distinct(pnd_index_owner||'.'||pnd_index_name) as index_name from ctx_pending; 
BEGIN 
FOR rec1 IN sql1 LOOP 
ctx_ddl.sync_index(rec1.index_name); 
END LOOP; 
END; 

,然後安排它通過DBMS_JOB運行:

DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720'); 

至於指數的優化,可以使用下面的命令(也可以用DBMS_JOB或預定通過cron):

alter index my_index rebuild online parameters('optimize full maxtime 60'); 

還有CTX_ *包提供了類似的功能。

+0

11g及以上,Oracle不建議使用alter index重建文本索引,而是使用ctxsys.ctx_ddl.optimize_index – Roy 2016-09-05 18:07:05

16

你是什麼意思「不自動更新」?

該索引可以在提交或定期進行同步。

Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC (ON COMMIT)') 
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")') 

我不需要實時搜索的準確性,我們的DBA建議定期同步索引,比如說每2分鐘。如果你有能力在一夜之間做到這一點,那就更好了。什麼是最好的取決於你的負載和文件的大小。

這些鏈接也許可以爲您提供更多信息:

對於DBA的意見,也許serverfault更好?

+0

「提交」似乎不被推薦。是否可以指定定期索引優化,索引創建? – trunkc 2009-12-17 11:33:25

+6

請注意:如果您使用SYNC(ON COMMIT)和MULTI_COLUMN_DATASTORE,索引同步只會在包含實際索引的列受到影響時觸發。例如,如果您有索引位於A的列A,B和C上的多列索引,那麼列B的UPDATE不會觸發索引同步。 – BernardMarx 2013-01-11 12:09:18

1

將此處作爲Oracle 12C用戶的更新。 如果您在實時模式下使用索引,那麼它會將項目保存在內存中,並週期性推送到主表格,從而保持碎片不變,並啓用對流式內容的NRT搜索。 下面是如何設置它

exec ctx_ddl.drop_preference ('your_tablespace'); 
exec ctx_ddl.create_preference('your_tablespace', 'BASIC_STORAGE'); 
exec ctx_ddl.set_attribute ('your_tablespace', 'STAGE_ITAB', 'true'); 
create index some_text_idx on your_table(text_col) indextype is ctxsys.context PARAMETERS ('storage your_tablespace sync (on commit)') 

這將設立在NRT模式下的指數。這很漂亮。