2009-12-16 49 views
9

Queremos utilizar un tipo de índice ctxsys.context para búsqueda de texto completo. Pero me sorprendió bastante que un índice de este tipo no se actualice automáticamente. Tenemos 3 millones de documentos con aproximadamente 10k de actualizaciones/inserciones/eliminaciones por día.¿Cómo sincronizar y optimizar un índice de texto de Oracle?

¿Cuáles son sus recomendaciones para sincronizar y optimizar un índice de Oracle Text?

+0

¿Qué indicaciones tiene de que el índice no se está sincronizando? – dpbradley

+0

Es bastante común que este tipo de herramientas no hagan suposiciones sobre sus requisitos específicos. La creación y el mantenimiento de índices en grandes cantidades de datos no estructurados generalmente requieren cierta consideración para que las elecciones de diseño produzcan una solución con compensaciones aceptables. Las estrategias de actualización y mantenimiento para un motor de búsqueda probablemente serán muy diferentes de una solución de autoría colaborativa, que funciona de forma paralela a los análisis. Oracle le ofrece una pequeña gama de opciones de sincronización para elegir, y con solo 10k diarios DML, puede salirse con la suya con cualquiera de ellos. – Roy

Respuesta

3

Creo que la opción 'SYNC EVERY', como se describe en la respuesta anterior, solo está disponible en Oracle 10g o posterior. Si está utilizando una versión anterior de Oracle, deberá ejecutar la operación de sincronización periódicamente. 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 del índice, siguiente comando se puede utilizar (también puede ser programado con DBMS_JOB o a través de cron):

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

También hay un paquete CTX_ * con funciones similares disponibles.

+0

para 11g y más, Oracle no recomienda reconstruir índices de texto con el índice alter, sino que usa ctxsys.ctx_ddl.optimize_index – Roy

16

¿Qué quiere decir con "actualización no automática"?

El índice se puede sincronizar en confirmación 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")') 

que no necesitas precisión de la búsqueda en tiempo real nuestra DBA recomienda sincronizar el índice periódicamente, dicen cada 2 min. Si puede permitirse hacerlo de la noche a la mañana, incluso mejor. Lo 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?

+0

"Al confirmar" parece no ser recomendable. ¿También es posible especificar la optimización del índice periódico en la creación del índice? – trunkc

+6

Solo una nota para tener en cuenta: si está utilizando SYNC (ON COMMIT) con MULTI_COLUMN_DATASTORE, la sincronización del índice solo se activará cuando la columna que contiene el índice real se vea afectada. Por ejemplo, si tiene un índice de varias columnas sobre las columnas A, B y C con el índice que reside en A, entonces una ACTUALIZACIÓN de la columna B NO activará la sincronización del índice. – BernardMarx

1

Poniendo esto aquí como una actualización para los usuarios de Oracle 12C. Si usa el índice en modo de tiempo real, mantiene los elementos en la memoria y periódicamente avanza hacia las tablas principales, lo que mantiene la fragmentación baja y habilita la búsqueda de NRT en el contenido de transmisión. Así es como 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 muy dulce

Cuestiones relacionadas