如何同步和优化 Oracle Text 索引?

发布于 2024-08-15 06:08:56 字数 135 浏览 8 评论 0原文

我们希望使用 ctxsys.context 索引类型进行全文搜索。但令我感到非常惊讶的是,这种类型的索引不会自动更新。我们有 300 万个文档,每天约有 1 万次更新/插入/删除。

您对同步和优化 Oracle Text 索引有何​​建议?

We want to use a ctxsys.context index type for full text search. But I was quite surprised, that an index of this type is not automatically updated. We have 3 million documents with about 10k updates/inserts/deletes per day.

What are your recommendations for syncing and optimizing an Oracle Text index?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

猫九 2024-08-22 06:08:56

“不自动更新”是什么意思?

索引可以在提交时同步或定期同步。

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 更好?

What do you mean by "not automatically updated"?

The index can be synchronized on commit or periodically.

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

I you don't need real-time search accuracy our DBA recommended to sync the index periodically, say each 2 min. If you can afford to do it overnight, then even better. What is best depends on your load and the size of the document.

These links can probably provide you with more information:

For DBA advice, maybe serverfault is better?

晨敛清荷 2024-08-22 06:08:56

将此作为 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 模式下设置索引。非常甜蜜。

Putting this here as an update for Oracle 12C users.
If you use the index in real time mode, then it keeps items in memory, and periodicially pushes to the main tables, which keeps fragmentation down and enables NRT search on streaming content.
Here's how to set it up

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)')

this will set up the index in NRT mode. It's pretty sweet.

¢好甜 2024-08-22 06:08:56

我认为“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_* 包可用。

I think 'SYNC EVERY' option, as described in previous answer only available in Oracle 10g or newer. If you're using older version of Oracle you would have to run sync operation periodically. For example, you can create following stored procedure:

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;

and then schedule it run via DBMS_JOB:

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

As for index optimization, following command can be used (also can be scheduled with DBMS_JOB or via cron):

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

There is also CTX_* package with similar function available.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文