Cómo sincronizar y optimizar un índice de Oracle Text?
-
20-09-2019 - |
Pregunta
Queremos utilizar un tipo de índice ctxsys.context
para la búsqueda de texto completo. Pero yo estaba muy sorprendido, que un índice de este tipo no se actualiza automáticamente. Tenemos 3 millones de documentos con unos 10k actualizaciones / inserciones / eliminaciones por día.
¿Cuáles son sus recomendaciones para la sincronización y la optimización de un índice de Oracle Text?
Solución
Creo que la opción 'Sincronizar CADA', tal como se describe en la respuesta anterior sólo está disponible en Oracle 10g o más reciente. Si está utilizando la versión anterior de Oracle que tendría que ejecutar la operación de sincronización periódica. Por ejemplo, puede crear procedimiento almacenado siguiente:
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;
y luego programar que se ejecute a través de DBMS_JOB:
DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');
En cuanto a la optimización de índice, siguiente comando se puede utilizar (también se pueden programar con DBMS_JOB o a través de cron):
alter index my_index rebuild online parameters('optimize full maxtime 60');
También hay CTX_ * paquete con función similar disponible.
Otros consejos
¿Qué quiere decir con "no se actualizan automáticamente"?
El índice se puede sincronizar en cometer o periódicamente.
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')
Yo no necesitas precisión de la búsqueda en tiempo real nuestra DBA recomienda sincronizar el índice periódicamente, por ejemplo cada 2 min. Si usted puede permitirse el lujo de hacerlo durante la noche, a continuación, aún mejor. Lo que es mejor depende de su carga y el tamaño del documento.
Estos enlaces probablemente le puede proporcionar más información:
Para obtener asesoramiento DBA, tal vez serverfault es mejor?
Su puesta aquí como una actualización para los usuarios de Oracle 12C. Si se utiliza el índice en tiempo real, a continuación, se mantiene los artículos en la memoria, y periodicially empuja a las tablas principales, lo que mantiene la fragmentación hacia abajo y permite la búsqueda NRT en el contenido de streaming. Aquí es cómo configurarlo
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)')
Esto configurará el índice en el modo NRT. Es bastante dulce.