9
votes

Comment synchroniser et optimiser un index de texte Oracle?

Nous voulons utiliser un ctxsys.context type d'index pour la recherche de texte intégral. Mais j'ai été assez surpris, qu'un index de ce type n'est pas automatiquement mis à jour. Nous avons 3 millions de documents avec environ 10 000 mises à jour / inserts / suppressions / suppressions par jour.

Quelles sont vos recommandations pour la synchronisation et l'optimisation d'un index de texte Oracle?


2 commentaires

Quelles indications avez-vous que l'index ne reste-t-il pas en synchronisation?


Il est assez courant que ces types d'outils ne prennent pas d'hypothèses sur vos besoins spécifiques. Créer et maintenir des indices sur de grandes quantités de données non structurées nécessite généralement une certaine considération afin que vos choix de conception produisent une solution avec des compromis acceptables. Les stratégies de mise à jour et de maintenance pour un moteur de recherche seront probablement très différentes d'une solution de création collaborative, qui surveille le formulaire Appart prenant en charge Analytics. Oracle vous donne une petite gamme d'options de synchronisation parmi lesquelles choisir et avec seulement 10k Daily DML, vous pouvez probablement vous échapper avec aucun d'entre eux.


3 Réponses :


16
votes

Que voulez-vous dire par "non mise à jour automatique"?

L'index peut être synchronisé sur commit ou périodiquement. P>

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


2 commentaires

"SUR COMMIS" semble ne pas être recommandé. Est-il également possible de spécifier une optimisation des index périodiques, sur la création d'index?


Juste une note à garder à l'esprit: Si vous utilisez Sync (sur Engage) avec un Multi_Column_DataStore, la synchronisation de l'index ne sera déclenchée que lorsque la colonne contenant l'index réel est affectée. Par exemple, si vous avez un index multi-colonnes sur les colonnes A, B et C avec l'index résidant sur A, une mise à jour de la colonne B ne déclenchera pas la synchronisation de l'index.



3
votes

Je pense que "synchroniser toutes les mesures", comme décrit dans la réponse précédente uniquement disponible dans Oracle 10G ou Newer. Si vous utilisez une version plus ancienne d'Oracle, vous devez exécuter périodiquement une opération de synchronisation. Par exemple, vous pouvez créer la procédure stockée suivante: xxx

puis planifier l'exécution via dbms_job: xxx

comme pour l'optimisation de l'index, suivant La commande peut être utilisée (peut également être planifiée avec dbms_job ou via cron): xxx

Il y a aussi ctx_ * package avec une fonction similaire disponible.


1 commentaires

Pour 11g et plus, Oracle ne recommande pas de reconstruire des indices de texte avec Alter Index, mais utilisez plutôt ctxsys.ctx_ddl.optimize_index



2
votes

Mettre cette option ici comme une mise à jour des utilisateurs Oracle 12C. Si vous utilisez l'index en mode temps réel, il conserve des éléments en mémoire et pousse périodiquement aux tables principales, ce qui permet de fragmenter la fragmentation et active la recherche NRT sur le contenu en continu. Voici comment le configurer

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


0 commentaires