mardi 24 novembre 2009

STOP! On n'indexe pas ces mots

Les index d'Oracle Text peuvent être configurés afin d'exclure une liste de mots qui ne sont pas nécessaires d'être indexés tels que les articles, les pronoms, les adverbes, etc...

En excluant des mots non significatifs, les indexes deviennent moins volumineux et plus optimal lors de leurs utilisations.

Dans mon cas, j'utilise Oracle Portal et j'ai modifié les paramètres de certains index pour exclure une liste de mots français communément appelé une "stoplist" qui contient des "stopword".

Oracle fournit un script qui nous simplifie la vie. Ce script s'intitule "drdeffrc.sql". Il contient toutes les commandes nécessaires pour la mise en place de cette liste. Cependant, je n'ai pas tout exécuté.

Pour débuter, j'ai créé les préférences liées au "wordlist"

PROMPT Creating wordlist preference...
begin
CTX_DDL.drop_preference('DEFAULT_WORDLIST');
CTX_DDL.create_preference('DEFAULT_WORDLIST','BASIC_WORDLIST');
CTX_DDL.set_attribute('DEFAULT_WORDLIST','STEMMER', 'FRENCH');
CTX_DDL.set_attribute('DEFAULT_WORDLIST','FUZZY_MATCH', 'FRENCH');
end;
/

Ensuite, j'ai créé la "stoplist". Ceci correspond au plus long bloc PL/SQL du script. Avant de l'exécuter, j'ai ajouté la commande qui détruit la "stoplist" autrement, la création n'aurait pas fonctionné car elle existe. Voici une aperçu du bloc PL/SQL :

PROMPT Creating stoplist...
declare
db_charset VARCHAR2(500);

procedure add_utf8_stopword(hexstring in VARCHAR2) is
begin
CTX_DDL.add_stopword('DEFAULT_STOPLIST', UTL_RAW.cast_to_varchar2(
UTL_RAW.convert(HEXTORAW(hexstring), db_charset,
'AMERICAN_AMERICA.UTF8')));
end add_utf8_stopword;

begin
SELECT 'AMERICAN_AMERICA.' || value
INTO db_charset
FROM v$nls_parameters
WHERE parameter = 'NLS_CHARACTERSET';

ctx_ddl.drop_stoplist('DEFAULT_STOPLIST');
ctx_ddl.create_stoplist('DEFAULT_STOPLIST');
ctx_ddl.add_stopword('DEFAULT_STOPLIST','a');
ctx_ddl.add_stopword('DEFAULT_STOPLIST','afin');
...
ctx_ddl.add_stopword('DEFAULT_STOPLIST','vu');
ctx_ddl.add_stopword('DEFAULT_STOPLIST','y');
end;
/

Suite aux changements effectués, on doit rebâtir tous les index pour que tous nos changements soient en vigueur :

ALTER INDEX "PORTAL"."WWSBR_CORNER_CTX_INDX"
REBUILD PARAMETERS ('replace stoplist default_stoplist');

En cas de besoin, vous pouvez exécuter les scripts suivants pour

  • Créer tous les index Oracle Text de Portal : ORACLE_HOME/portal/admin/plsql/wws/ctxcrind.sql
  • Détruire tous les index Oracle Text de Portal : ORACLE_HOME/portal/admin/plsql/wws/ctxdrind.sql
  • Modifier les préférences : ORACLE_HOME/portal/admin/plsql/wws/sbrimtlx.sql

Aussi, sachez qu'il existe un package CTX_REPORT qui permet de vérifier la configuration. Par exemple, vous pouvez utiliser ces procédures :

  • CTX_REPORT.DESCRIBE_INDEX
  • CTX_REPORT.CREATE_INDEX_SCRIPT
  • CTX_REPORT.INDEX_SIZE

Et, comme à l'habitude, il y a une panoplie de vues dans le dictionnaire qui
vous fourniront les informations désirées, en voici quelques unes :

  • CTX_PREFERENCES
  • CTX_PARAMETERS
  • CTX_STOPLISTS
  • CTX_STOPWORDS
  • CTX_INDEXES
  • CTX_INDEX_ERRORS


lundi 9 novembre 2009

Rétention de l'AWR et la taille de SYSAUX

Dernièrement, nous avons rencontré un problème de performance. Dans le but d'identifier et résoudre le problème, nous avions voulu comparer des clichés (snapshots) sur différentes périodes cependant, nous n'avons pas pu reculer assez loin dans le passé car les données de l'historique ne sont pas conservées suffisamment longtemps.

Pour éviter que cela se reproduise, nous voulons conserver une année complète d'information afin d'être en mesure de comparer des clichés (snapshots) à différentes périodes durant la dernière année.


Par défaut,
les clichés (snapshots) sont collectés à toutes les heures et ils sont conservés pour une période de 7 jours.

Pour afficher la configuration actuelle :

Select extract (day from snap_interval) * 24 * 60 +
extract (hour from snap_interval) * 60 +
extract (minute from snap_interval) "Snapshot Interval",
extract (day from retention) * 24 * 60 +
extract (hour from retention) * 60 +
extract (minute from retention) "Retention Interval"
from dba_hist_wr_control;


Pour modifier ces valeurs, il suffit d’utiliser le package suivant en spécifiant les valeurs désirées :

begin
dbms_workload_repository.modify_snapshot_settings (
interval => 60,
retention => 365*24*60
);
end;
/


Oracle a su nous faciliter la vie pour estimer la taille du tablespace SYSAUX. Il fournit un script (utlsyxsz.sql) qui évalue la taille que devrait être le tablespace SYSAUX. Son utilisation est fort simple. L'exécution s'effectue en mode interactif et on doit tout simplement fournir certaines valeurs pendant l'exécution.

Suite à l'exécution, l'estimation me recommande de définir un tablespace d'environ 60 GB. Voici un extrait de l'exécution du script :

...
~~~~~~~~~~~~~~~~~~~~~~
Estimated SYSAUX usage
~~~~~~~~~~~~~~~~~~~~~~

| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Estimated size of AWR: 60,143.6 MB
| Estimated size of AWR per instance: 20,047.9 MB
|
| The AWR estimate was computed using
| the following values:
|
| Interval - 60 minutes
| Retention - 365.00 days
| Num Instances - 3
| Active Sessions - 20.00
| Datafiles - 139
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Estimated size of Stats history 182.7 MB
|
| The space for Optimizer Statistics history was
| estimated using the following values:
|
| Tables - 5,205
| Indexes - 10,294
| Columns - 64,429
| Partitions - 17
| Indexes on Partitions - 51
| Columns in Partitions - 136
| Stats Retention in Days - 31
| Level of DML Activity - Medium
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...

En passant. ce script prend en compte un environnement RAC. Lors de l'exécution, vous pouvez spécifier le nombre d'instance.

Maintenant, il reste à voir si l'estimation est réaliste.