0

Oracle Text pour DBA Oracle : Partie 1

twitterlinkedinmail

Nous allons explorer Oracle Text et son son administration en tant que DBA.

La première partie concerne l’installation et l’implémentation.
Oracle est une base de données relationnelles, les données sont donc gérées en deux dimensions sous forme de table.
Certains types de données (géographique, audio, vidéo et texte) sont difficiles voire impossibles à normaliser.
Historiquement des solutions non relationelles existaient avec Adabas ou Objectivity DB par exemple.
Oracle a amélioré sa gestion des données non relationnelles avec :
– Oracle Spatial : pour les données géographiques
– Oracle Intermedia : pour les données audio-vidéos
– Oracle Text : pour les données textes
Ces fonctionnalités reposent essentiellement sur des colonnes de type LOB pour stocker les données et un ensemble de procédures pour les gérer.
Oracle Text est utilisable dans toutes les distibutions d’Oracle (SE, SE One, PE, EE) et ignorer son existence est une erreur.
Elle permet d’effectuer des recherches et de générer des rapports sur une variété de format (html, xml, pdf, word..).
Son interface est ouverte et peut être utilisée par des logiciels tiers.
Sa compréhension est indispensable à tout DBA Oracle.

1) Vérification de l’installation d’ Oracle Text

– Vérifier la présence du  schéma  ctxsys (mot de passe par défaut ctxsys).
Attention le compte peut être verrouillé (et doit le rester en production)
 SELECT * FROM ctxsys.ctx_version;
-Son installation est faite en standard.
Néanmoins si l’option n’a pas été installée vous pouvez utiliser la démarche suivante :
  conn SYS/syspasswd AS SYSDBA
  @?/ctx/admin/catctx.sql mypasswd SYSAUX TEMP NOLOCK
–pour le langage de préférence par défaut drdefxx.sql (English(us),French(f),..)
conn CTXSYS/mypasswd
@?/ctx/admin/defaults/drdefus.sql
– Par défaut le shéma se trouve sur le tablespace SYSAUX
select space_used_kbytes from v$sysaux_occupants where occupant_name='TEXT';
Il est possible de modifier le tablespace, par exemple vers le tablespace TBS_CONTEXT  :
execute ctxsys.dri_move_ctxsys(tbs_name=>'TBS_CONTEXT');

2) Création d’un index Oracle Text simple

create tablespace TBS_TEXT datafile '+DATA' size 10M autoextend on maxsize 200M
 extent management local uniform size  64K;
CREATE USER user_text IDENTIFIED BY text DEFAULT TABLESPACE TBS_TEXT
TEMPORARY TABLESPACE temp PROFILE default QUOTA UNLIMITED ON TBS_TEXT;
— droits nécessaires
GRANT EXECUTE ON ctxsys.ctx_ddl TO user_text;
GRANT CTXAPP TO user_text;
GRANT CREATE PROCEDURE TO user_text;
GRANT CREATE SESSION TO user_text;
GRANT CREATE TABLE TO user_text;
GRANT SELECT ANY DICTIONARY TO user_text;
GRANT CREATE JOB to user_text;
GRANT CREATE TRIGGER to user_text;
— jeu de test
CONNECT user_text/text
create table test_tab (clob_col clob);
create index test_idx on test_tab (clob_col) indextype is ctxsys.context;
commit;
insert into test_tab values ('c a b d');
insert into test_tab values ('ab');
commit;
— requête de test de filtre
select * from test_tab where CONTAINS(clob_col,'ab') > 0;

3) Structure interne

Un index Oracle Text utilise  l’environnement “Extensibility Framework” appelé parfois cartouche.
L’objectif est de donner aux dévéloppeurs la possibilité de créer leurs propres types d’index.
Un index doit ramener un ensemble de ROWID, il est nécessaire de gérer la mise à jour de l’index et toutes les opérations associées.
La création d’un index Oracle Text repose sur des objets Oracle et sur des routines de mises à jour contenues dans le noyau.
Regardons ce que la création d’un index de domaine simple a crée :

Au niveau table :

select table_name,IOT_TYPE, tablespace_name from USER_TABLES ;
TABLE_NAME                     IOT_TYPE     TABLESPACE_NAME
------------------------------ ------------ ------------------------------
DR$TEST_IDX$K                  IOT
DR$TEST_IDX$N                  IOT
DR$TEST_IDX$R                               TBS_TEXT
DR$TEST_IDX$I                               TBS_TEXT
TEST_TAB                                    TBS_TEXT
– 4 tables ont eté crées, elles se nomment DR<index_text_name><K,N,R,I>
– 2 tables sont des IOTs

Au niveau des index :

select index_name,table_name, tablespace_name,INDEX_TYPE from user_indexes
where INDEX_TYPE in ('DOMAIN','NORMAL','IOT - TOP')
INDEX_NAME                     TABLE_NAME                     TABLESPACE_NAME                INDEX_TYPE
------------------------------ ------------------------------ ------------------------------ ----------
TEST_IDX                       TEST_TAB                                                      DOMAIN
SYS_IOT_TOP_72679              DR$TEST_IDX$N                  TBS_TEXT                       IOT - TOP
SYS_IOT_TOP_72674              DR$TEST_IDX$K                  TBS_TEXT                       IOT - TOP
DR$TEST_IDX$X                  DR$TEST_IDX$I                  TBS_TEXT                       NORMAL
Nous avons la structure des 2 IOTS <SYS_IOT_TOP_>.. et un index DR$TEST_IDX$X sur la table DR$TEST_IDX$I

Au niveau des colonnes LOB :

SELECT table_name "Table", column_name "Column", segment_name "Segment" , index_name "Index"
FROM user_lobs
WHERE table_name like 'DR$%';
Table                          Column       Segment                        Index
------------------------------ ------------ ------------------------------ ---------------------
DR$TEST_IDX$I                  TOKEN_INFO   SYS_LOB0000072671C00006$      SYS_IL0000072671C00006$
DR$TEST_IDX$R                  DATA         SYS_LOB0000072676C00002$      SYS_IL0000072676C00002$
Nous avons 2 colonnes de types LOB sur TOKEN_INFO et DATA sur les tables DR$TEST_IDX$I et DR$TEST_IDX$R

Conclusion :

Pour le DBA, la création d’un index Oracle Text entraine la création d’un ensemble d’objets  :
– D<index_name>$I : Token table
– table des mots ‘Token’
– liste des mots avec position dans le document
– contient une colonne LOB token_info (représentation binaire des documents les contenant)
– chaque document est représenté par la valeur DOCID
– DR<index_name>$X :
– index B-tree sur la table $I, toutes les colonnes sauf la colonne lob
– DR<index_name>$N : Negative Row Table
– contient les DOCID supprimés
– supprimé par le processus d’optimisation
– DR<index_name>$K : Table de mapping ROWID -> DOCID
– Table IOT , recherche de DOCID à partir d’un rowid
– DR<index_name>$R : Table de mapping DOCID -> ROWID
– Table IOT , recherche de rowid à partir d’un DOCID
– DR<index_name>$P : Optionnel ,IOT pour recherche rapide sur liste de mots (wordlist preference)
– DR<index_name>$R : Optionnel,si utilisation de paramètres FILTER BY ou ORDER BY
La deuxième partie concerne le comportement d’un index Oracle TEXT avec du DML

Continuez votre lecture sur le blog :

twitterlinkedinmail

Capdata team

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.