Overblog
Suivre ce blog Administration + Créer mon blog
18 décembre 2008 4 18 /12 /décembre /2008 21:03
Bonjour,

Lorsque l'on parle de base Oracle, on entend souvent parler  de datafiles,  d'archive log,...
Autant de fichiers qu'il faut bien sur sauvegarder au risque de se faire des frayeurs.
Il est en est un autre qui ne paye pas de mine, qui prend très peu de place mais qui est tout simplement VITAL : J'ai nommé le Control file !

Qu'est ce qu'un Control File ?
C'est un petit fichier binaire qui contient des informations contenant la structure de la base.
Le control file contient:
  • Le nom de la base de donnée
  • Les noms et emplacements des datafiles ainsi que des redo logs.
  • La date de création de la base de données.
  • Le numero de séquence du log actuel
  • Informations concernant les "checkpoint" 

Alors autant vous dire que ce fichier a beau être petit, sa perte aurait des conséquences dramatiques. En effet sans ce fichier la base ne pas être placée en mode montée "Mount" et toute restauration devient compliquée.

Oracle dans sa grande bonté permtet le multiplexage des control files. Vous auriez tort de vous en priver !
Encore faut-il savoir combien votre base utilse actuellement de control file et leur emplacement.



SELECT VALUE FROM v$PARAMETER WHERE NAME='control_files';
ou
SELECT NAME FROM V$CONTROLFILE;



Si jamais votre base ne dispose que d'un seul control file, je ne saurai trop vous recommander d'en ajouter au plus vite. Vous pouvez avoir au plus 8 control files, mais 3 semble être une valeur "correcte". Dans l'idéal, les différents control files doivent être placés sur des disques différents.

En théorie, a chaque modification de la structure de base (ajout de datafile, de redo, ou autre information étant dans le controlfile) il faudrait sauvegarder les controlfiles pour avoir une bonne version des fichiers. Ca peut être très vite fastidieux.

Si vous utilisez RMAN pour vos sauvegardes, alors pensez à y inclure les sauvegarde de control files.



RMAN > CONFIGURE CONTROLFILE AUTOBACKUP ON;


Par ailleurs, si vous desirez récuperer le script de création de controlfile vous pouvez effectuer la commande suivante en user SYSTEM


ALTER DATABASE BACKUP CONTROLFILE TO TRACE;


Le fichier de trace sera généré dans /ORACLE_HOME/admin/ORA_SID/udump. Faut faire un peu le ménage (beaucoup de commentaires [à lire avant d'enlever])

LAO.
 

 
Partager cet article
Repost0
16 décembre 2008 2 16 /12 /décembre /2008 10:59
Bonjour,

Qui n'a pas eu un jour sa petite ORA-600 avec un certain nombres d'arguments. Ce genre d'erreur n'est pas l'erreur la plus appréciée car il peut s'agir de tout et n'importe quoi. Donc afin d'éviter des recherches longues et sinueuses il convient de respirer un grand coup et de prendre le bon chemin.

Pour cela, notre ami Oracle a mis à notre disposition un outil:ORA-600 Argument Lookup Tool.
Pour accèder à cet utilitaire, il faut bénéficier d'un compte Metalink

lien pour accéder à ORA-600 Argument Lookup Tool : cliquer ici.
Ce petit utilitaire fonctionne également pour les ORA-7445

Un petit formulaire va vous demander le premier argument suivant l'ORA-600 (ex: ORA-600 [723],...)
Vous pouvez également indiquer la version d'Oracle utilisé pour restreindre la recherche.
Une fois le premier argument renseigné, il suffit de cliquer sur "Lookup Error" et Metalink va vous retourner vers les articles relatifs à l'erreur.

LAO
Partager cet article
Repost0
13 décembre 2008 6 13 /12 /décembre /2008 20:28
Bonsoir,

Depuis Oracle 10, il existe une console web appelé plus courramment "db control". Cette console est très succeptible au changement d'adresse IP ou du nom de la machine. Vous pouvez vous amusez si vous avez une machine virtuelle à changer l'IP ou le nom de la machine,et vous devez certainement apprendre à vivre sans votre console web d'administration.

Le moyen le plus rapide et le plus sure de récuperer sa console au plus vite est de désinstaller cettec console et de la réinstaller.

Désinstallation

Ouvrir une commande dos (sous windows)  puis:


<ORACLE_HOME>/bin/emca -x <SID> (pour une version 10.1.x)
<ORACLE_HOLE>/bin/emca -deconfig dbcontrol db (pour les versions 10.2.x)


Dans le second cas, il vous sera demandé le SID une fois la validation de la commande.

Insallation :


<ORACLE_HOME>/bin/emca -r (pour une version 10.1.x)
<ORACLE_HOME>/bin/emca -config dbcontrol db (pour une version 10.2.x)


Pour que la création se passe correctement,il faut répondre aux questions posées par le prompt (SID,..)

Remarque : Que ce soit pour l'installation ou la désinstallation, assuerez vous que le listener soit bien démarré.

Remarque : Pour ceux qui aimeraient connaitre les différents méthodes pour la création et la suppression de la "db control", reportez vous à la note 278100.1 de metalink.

LAO.



 
Partager cet article
Repost0
11 décembre 2008 4 11 /12 /décembre /2008 20:11
Bonsoir,

Mais qu'est ce donc que ce Recycle Bin ?

Il s'agit d'une table du dictionnaire de donnée contenant des informations sur les objets supprimés. Pour simplifier, c'est une vulgaire corbeille comme vous pouvez en avoir sur windows.
Cela signifie tout simplement que depuis Oracle 10, vous pouvez vous permettre le luxe de supprimer une table par hasard et de la faire réapparaitre sans même l'intervention de votre DBA préféré.

Comment ca fonctionne ?

Pour commencer je crée une table ex1 que je vais ensuite supprimer.


CREATE TABLE ex1 (i NUMBER);
DROP TABLE ex1;



A ce moment, on peut penser que c'est terminé, ma table ex1 est partie dans le néant et les données qu'elle contenait également. En fait c'est ce qui se passait avant que cette corbeille apparaisse !

La table n'est plus visible mais elle a été placée dans la corbeille. Ce qui signifie aussi que l'espace qu'occupait cette table n'a pas été rendu !

Alors pour savoir quels sont les objets qui sont dans votre corbeille, il suffit d'interroger la vue  User_RecycleBin ou encore plus simplement le synonyme associé RecycleBin.


SELECT * FROM RecycleBin;


Quelles informations avons nous ?
  • Object_Name => le nom de l'objet dans la corbeille, commencant toujours par BIN$ suivant d'un identifiant unique de 26 caractère + un numéro de version dans le cas ou on s'amuserait à créer et a supprimer plusieurs fois la même table.
  • Original_Name => Vous aurez deviné qu'il s'agit du nom d'origine de l'objet (dans mon cas ex1)
  • Type => Correspond au type d'objet supprimé (Table, Index)
  • CreateTime => Date de création de l'objet.
  • DropTime => Date de suppression de l'objet.
  • DropScn => numero de scn, utile si on veut restaurer une version particulière de la table.
  • Space => Nombre de blocks utilisé par l'objet en question. (vous allez peut être découvrir quelques GO de libre...)
Il existe d'autres colonnes, mais je pense avoir cité les principales.
Alors si c'est bien d'avoir une corbeille, il est aussi interessant de savoir ce que l'on peut faire avec.
En générale depuis une corbeille, soit on restaure, soit on purge pour liberer de la place.

Remarque : La corbeille est propre a chaque schema, et en se connectant en sys on peut accèder à la vue DBA_RecycleBin qui permet de voir tous les objets dans la corbeille quelque soit le propriétaire. On n'a d'ailleurs une colonne Owner en plus pour identifier ce propriétaire.

1er cas : Purge complète de la corbeille (en owner).


PURGE RecycleBin; (on ne peut pas faire plus simple)


2ème cas : Purge d'un objet en particulier.


PURGE TABLE ex2;
ou
PURGE TABLE BIN$............



Remarque : Si il existe plusieurs verson de la table et que vous utilisez PURGE TABLE No_Table; alors seule la version la plus récemment supprimée sera purgée.

3ème cas : Restauration d'un objet.


FLASHBACK TABLE ex1 TO BEFORE DROP;
ou (si vous êtes maso ou si vous avez plusieurs versions de la table)
FLASHBACK TABLE BIN$............... TO BEFORE DROP;



Remarque : Si votre table avait des indexes (ou /et ) des contraintes, les indexes et contraintes seront restaurés avec le nom de corbeille (BIN$....) et non pas le nom d'origine, il convient donc de renommer les objets après restauration (ex: ALTER INDEX "BIN$......." RENAME TO Nom_Origine;)

4ème cas : Purge de tous les objets de la base


CONNECT / as sysdba
PURGE Dba_RecycleBin;



ATTENTION :  Je ne serai pas complet, si je ne disais pas qu'il existait un paramètre système  qui permet de d'inactiver cette fonction.Par défaut, à l'installation d'ORACLE, cette fonction est activée.


CONNECT system/*******
ALTER SYSTEM SET RECYCLEBIN=OFF;



On peut également désactiver la fonction au niveau d'une session


ALTER SESSION SET RECYCLEBIN=OFF;


A mon sens, il est relativement stupide de désactiver cette option.
Pourquoi ?
  • C'est se priver d'une possibilité rapide et simple de faire face à une erreur humaine.
  • Un utilisateur lambda peut même réparer son erreur sans l'intervention du DBA.
  • Etant donné que l'on peut modifier le comportement au niveau session, si vraiment dans le cas d'un traitement particulier (table temporaire), on ne veut pas garder de trace il suffit de faire un ALTER SESSIONDROP TABLE ma_table PURGE; Dans ce cas la table va directement dans la néant sans passer par la case corbeille. ou utiliser la commande
  • Ca peut même devenir un outil puissant. Exemple : Une application crée par traitement de nuit un pseudo datawarehouse en plusieurs heures en prenant soin de supprimer les tables existantes avant de commencer. Pour une raison inconnu, le traitement se plante. Et bien les utilisateurs finaux n'ont pas accès à leur datawarehoure préféré. En admettant que la hotline soit dans un pays lointain,cela peut prendre plusieurs jours. Grace à une restauration des tables via la corbeille on peut revenir à l'état J-1 très rapidement. (Remarque : Toute information ressemblant à des faits issues du vrai monde, ne serait que pure coincidence !)
  • Il convient néanmoins au DBA de surveiller à ce que cette corbeille ne devienne pas trop encombrante et éventuellement de programmer un traitement périodique pour effectuer une purge des objets les plus anciens ou inutiles.

ATTENTION : UN DROP USER ou DROP TABLESPACE, ne passe pas par la corbeille. Il faut passer par une sauvegarde pour récupérer les objets perdus.

ATTENTION : Si vous utilisez des scripts de maintenance appelant la table User_Objects vous devez vous attendre à quelques soucis. Il faut prévoir une clause pour exclure les nom d'objets commencant par BIN$ a moins que vous soyez assez malade pour appeler des indexes ou des tables de la sorte. Autre solution, préferez les vues USER_INDEXES et USER_TABLES que USER_OBJECTS avec une clause sur la colonne TYPE.

LAO.






Partager cet article
Repost0
10 décembre 2008 3 10 /12 /décembre /2008 22:05
Bonsoir,

Comme vous le savez, depuis Oracle 10, il existe une console web permettant d'administrer votre base Oracle (ajout de user, ajout de tbs, surveillance,...)
On peut même si on le désire arreter le listener, voir la base, ou effectuer des opérations concernant RAC (Real Application Cluster).

Si vous êtes dans un environnement windows et que vous avez essayé par exemple d'arreter votre listener ou votre base, vous avez peut être eu le droit à cette jolie erreur.


Et la vous vous demandez pourquoi Oracle vous demande ca, alors qu'a priori on suppose que vous vous êtes connecté avec un compte system voir Sys as sysdba ou sysoper pour arreter la base.
En fait dans nom d'utilisateur et mot de passe, Oracle attends un compte bénéficiant de certains droits particulier.

Ma machine étant une windows XP, je décide de créer un compte windows que je nommerai "oracle".
Et ensuite, je vais lui attribuer des droits particuliers.

La manipulation est relativemet simple:


Panneau de configuration > Outil d'administration > Paramètres de sécurité locaux >


Et ensuite dans les stratégies locales / attribution des droits utilisateur je vais sélectioner la stratégie "Ouvrir une session en tant que tâche" et je vais y ajouter mon utilisateur oracle fraicement créer.


Une fois cette opération effectuée, il me suffit de revenir à ma console et d'entrer mon login (utilisateur oracle que je viens de créer) et le mot de passe associé, et au lieu d'avoir une erreur, j'accède à l'écran permettant de stopper ou démarrer le listener , ou tout autre écran nécessitant une authentification supplémentaire à l'authentification Oracle.

LAO.








Partager cet article
Repost0
9 décembre 2008 2 09 /12 /décembre /2008 21:46
Bonsoir,

Ce soir, je vais rédiger un petit post mais néanmoins utile. Comment connaitre la version d'ORACLE utilisée ?
Cette question au premier abord est assez simple, mais vous pouvez faire une petit test: Demandez autour de vous aux personnes qui s'occupent de vos bases ORACLE quelle est la version exacte d'Oracle installée et bien sur son niveau de patch, que ce soit des Patch Set (montée de version), des CPU (Critical Patch Update) qu'Oracle met en ligne tous les trimestres ou tout simplement des patches temporaires que l'on peut assimiler à des Hot fix.

Evidemment, je ne m'adresse pas aux DBA experts (qui connaissent la réponse) , mais plutôt à mes amis éditeurs qui sans forcement s'en rendre compte perdent un peu le controle d'une pièce essentielle de leur architecture : la base de données.

En effet, on a déjà vu dans ne nombreux cas, ou il arrivait que l'on ne puisse pas reproduire un problème client. Il est déjà bien compliqué d'utiliser la même version du logiciel fabriqué, mais parfois il arrive que le bug ou problème de perfermance ne soit pas lié à une malformation liés à un développement hasardeux, mais tout simplement à un bug ORACLE !

Or pour mettre à jour cela, encore faut il savoir sur quelle version on test,et quelle version a le client ! 

Exemple:
J'ouvre une commande DOS, et je m'assure que ma variable ORACLE_HOME est bien initialisée:


SET ORACLE_HOME= c:\oracle\product\10.2.0 (pour windows)
export ORACLE_HOME = \apps\..... (pour linux)


Et une fois cela fait, je vais utiliser l'utiliataire Opatch fournit par ORACLE.

windows:


%ORACLE_HOME%\Opatch\opatch lsinventory

linux:


$ORACLE_HOME/Opatch/optach lsinventory
 
Résultat:
 

 
 On obtient des informations précieuses : 
Dans mon exemple, on voit qu' à l'origine j'avais une version 10.2.0.1 qui a été mise à jour avec une 10.2.0.2.
Nous pouvons également voir que j'ai appliqué un patch temporaire avec le numéro de patch, la date et heure d'application, et cerise sur le gateau, la liste des bugs fixés par l'application du patch.
Un fichier de sortie contenant toutes ces informations a été crée dans
%ORACLE_HOME%\cfgtoollogs\opatch\lsinv\
 
Cela peut quand même être utile de savoir cela ! 
 
LAO. 
Partager cet article
Repost0
6 décembre 2008 6 06 /12 /décembre /2008 17:35
Bonjour,

Dans l'article précédent (http://www.lao-dba.com/article-25457591.html) nous avons vu que nous pouvions avoir des tables contenant un nombre important de lignes chainées et que cela pouvait avoir un impact pour les performances. Cela signifie qu'il faut d'une facon ou une autre il faut se débarasser de ce chainage. Alors pour cela, je vais vous proposer trois méthodes:

Méthode 1:
Une méthode connue et radicale pour éliminer les lignes chainée est tout simplement de faire un export de la table (expdp), de la supprimer et de réimporter la table (impdp).

Avantages de la méthode : Non seulement, on va supprimer les lignes chainées, mais on va également reconstruire les indexes, et remettre à le HWM (High Water Mark) a son niveau d'origine. 

Inconvénient : Si l'on est face à une table de plusieurs centaines de millions de lignes avec de nombreux indexes, cette opération peut devenier couteuse, et l'indisponibilité de la base assez longue.

Méthode 2 : 
Si on ne veut pas  passer par une opération d'import / export, il est possible d'utiliser la commande ALTER TABLE ma_table MOVE TABLESPACE Tbs
Dans mon cas, cela donne:


ALTER TABLE T_2 MOVE TABLESPACE USERS; 

Avantages de la méthode : Pas besoin d'exporter / supprimer / importer. Ce qui est peut être un plus, car nécessiterait d'octroyer des droits supplémentaires  à un user.

Inconvénient de la méthode:
En plus du fait que si la table est volumineuse, cela peut nécessiter un espace disque necessaire (le temps du move) et prendre un temps élevé, l'inconvenient majeur de cette méthode est que cela rends les indexes invalides. Et donc il faut reconstruire les indexes de la table en question. Le soucis, c'est que certains (DBA ou pas) oublient ce petit détail. Du coup on a une table qui effectivement n'a plus de lignes chainées, mais les indexes étant inutilisable (statut=UNUSABLE dans la vue USER_INDEXES), les performances vont se dégrader immediatement.
 

Methode 3:

La méthode que je vais vous proposer n'est valable que si les tables sont surveillées de façon réguilière. En effet, si on attend d'avoir 90% de lignes chainées, quel que soit la méthode, cela sera long et douloureux.
Je vais donc partir du principe que la table est surveillée, et que le % de lignes chainées est faible.
 Pour cela, on va utiliser la table CHAINED_ROWS qui non seulement nous donne le nombre de lignes chainées mais également le ROWID des lignes en question via la colonne Head_Rowid.
Le principe est simple:
  1. On crée une table temporaire avec les lignes chainées.
  2. On supprime de la table les lignes chainées.
  3. On ré-insere les lignes supprimées depuis la table temporaires.

Cela donnerait quelque chose comme:


CREATE TABLE tmp_t2 AS SELECT * FROM T_2 JOIN Chained_rows c
ON T_2.Rowid=c.Head_Rowid;

DELETE FROM T_2
WHERE Rowid IN (SELECT Head_RowId FROM Chained_Rows WHERE Table_Name='T_2';

INSERT INTO T_2 SELECT * FROM  Tmp_T2;
COMMIT;

DROP TABLE tmp_t2;



ATTENTION : En fonction du contexte, il se peut qu'il faille désactiver nos amis les contraintes et TRIGGER.
 
LAO.  
Partager cet article
Repost0
23 novembre 2008 7 23 /11 /novembre /2008 10:08

Bonjour,


Vous n'avez pas oublié ma table Reponse_1_P avec ses quelques dizaines de millions de lignes ?

Tant mieux, car on va en reparler encore un peu.

Juste pour rappel, la table est partionnée par date, puis sous-partionné par questionnaire.

Plusieurs choses peuvent arriver à cette table:

  • Quotidiennement de nouvelles données vont être intégrées
  • On va utiliser cette table pour créer de nouvelles tables d'aggrégations (calcul de moyenne par exemple) afin de rendre les requêtes moins couteuses
  • On va devoir sauvegarder.
  • Et de temps en temps purger un peu !

Mais avent tout, sachant que bon nombre de requêtes vont porter sur le pays en plus de la date et du type de questionnaire, il serait peut-être bon d'indexer la colonne ID_PAYS.


Rien d'extraordinaire me direz vous:



CREATE INDEX Idx_Pays ON Reponse_1_P(Date_Questionnaire,Id_Pays);

C'est effectivement une possibilité mais dans ce cas, l'index sera GLOBAL à la table, alors que des le départ il était question que les interrogations portent sur une date et un type de questionnaire.

Pour simplifier cela signifie que nos requêtes vont porter non pas sur l'ensemble de la table (même si rien nous en empeche), mais plutôt sur les partitions et sous-partitions.

Oracle permet de créer des indexes propres à la partition. Il suffit pour cela d'ajouter la clause "LOCAL"



CREATE INDEX Idx_Pays ON Reponse_1_P(Date_Questionnaire,Id_Pays) LOCAL;


Les avantages sont multiples:

  • Possibilité de reconstruire les indexes par partitions et donc de découper la maintenance de l'index dans le temps
  • Lors de l'ajout de nouvelles données dans une nouvelle partition,l'index sera mis à jour uniquement au niveau partition et non pas de facon globale. Or sur des tables de plusieurs centaines de millions de lignes l'impact n'est pas négligeable.


D'une façcon générale, Oracle recommande d'utiliser les indexes de type local dans un environnement type Datawarehouse. En effet, une maintenance sur une des partitions la table rendrait l'index invalide. Dans le cas d'un index global, c'est tout l'index qui serait invalide et le cout de la reconstruction de l'index serait couteux. Depuis Oracle 10, il est possible d'effectuer une maintenance d'index après un DDL sans rendre l'index inutilisable. La recommandation d'utiliser des index de type local reste cependant d'actualité. 

Remarque: Des indexex bitmap sur une table partitionnée sont toujours de type local.


Encore une fois, on se rend compte que les options que proposent ORACLE sont nombreuses et que lorsque on implémente une fonction avancée d'ORACLE, il convient de se documenter  un minimum au risque de se retrouver avec des problèmes de peformance ou d'administration complexes à résoudre de part les contraintes de disponibilités et des volumétries en jeu.

LAO.



Partager cet article
Repost0
16 novembre 2008 7 16 /11 /novembre /2008 20:12
Bonsoir,

Alors ce soir c'est article de fainéant. Mais bon c'est pour la bonne cause. J'ai décidé de parler de ORACLE 11. Il y  tellement de nouvelles choses dans cette nouvelle mouture d'ORACLE  qui date quand même de juillet 2007.
Alors c'est vrai qu'on attend la Release 2 pour envisager des passages en production mais il fait quand même bpn de commencer à s'y interesser. Si ma mémoire ne me trompe pas le 1er niveau de maintance pour Oracle 10 arrive à échéance en juillet 2010.

Le soucis c'est que pour parler d'ORACLE 11 et bien encore faut-il l'avoir.
Pour cela rien de plus simple, y a qu' a se servir sur le site d'ORACLE.

http://www.oracle.com/technology/software/products/database/index.html

Une fois que c'est fait, il faut l'installer. Bon j'ai pas spécialement envie de faire cohabiter cette version avec mon ORACLE 10 et ma femme ne veut plus financer l'achat de nouveaux PC. Il parait que j'en ai déjà trop !

Du coup, j'ai décidé de me pencher sur les solutions de virtualisation.
J'en connais 3 (ce qui ne veut pas dire qu'il n'y en pas d'autre).

Personnellement, j'ai choisi VM Ware. C'est gratuit et c'est simple. Pour créer les machines virtuelles, il faut VM WARE Serveur (http://www.vmware.com/download/server/).

En revanche pour utiliser les machines (sur un autre pc par exemple), VM ware player  qui est quand  même moins gourmand suffit.

Me voici donc prêt à installer ORACLE 11.
Pour cette première installation, je choisis une installation de base, en crééant une base par défaut.
Comme d'habitude, j'ai le droit à mon petit avertissement comme quoi mon IP est alloué par DHCP, ce qu'ORACLE apprécie moyennement. En réalité ce qu'ORACLE n'apprécie pas c'est le changement d'IP ou de nom de machine.

- Première constatation, à peine 10 minutes pour installer le noyau et les composants (temps de lecture des écrans inclus). Donc relativement rapide. Je suis quand même sur une machine virtuelle avec allocation d'espace disque au fur et à mesure.
- Seconde constation le temps de création de ma base est lui aussi relativement rapide (de l'ordre de quelques minutes).

D'ailleurs avez vous remarqué que la création de la première base est toujours beacoup plus rapide que la création des bases suivantes.
Ca s'explique assez facilement. ORACLE EST UN TRICHEUR. Lorsque ORACLE vous propose la création d'une base à l'installation du logiciel, il ment !
Oracle devrait demander "Voulez vous restaurer une base ?" Oracle utilise un clonage de base via RMAN ce qui est bien évidemment plus rapide que la création d'une base.
D'ailleur si vous faites attention, lors de l'étape de la création de base (Database Configuration Assistante), il est indiqué "Clone database creation in progress"

Premièr vrai changement :Oracle m'indique qu'excepté les comptes SYS, SYSTEM, DBSNMP et SYSMAN tous les autres comptes sont vérouillés. Il semble qu'ORACLE ai suivi le chemin de bon nombre d'éditeurs dans la direction du "tout sécuritaire".

Juste par acquis de conscience, je lance une session sql plus pour vérifier que je peux me connecter.

Me voila prêt pour voir un peu les grandes nouveautés de cette version croyez moi, il y en a !
Il est grand temps pour moi de me tourner vers quelque chose d'un peu moins rationnel : Le foot  !( on ne peut pas avoir que des qualités)

A bientôt.

LAO.
Partager cet article
Repost0
13 novembre 2008 4 13 /11 /novembre /2008 20:23
Bonsoir,

Me revoila avec mes histoires de partitionnement. Juste un petit post pour revenir sur les trois types de partiionnement possibles:
  • Partition by range
  • Partition by list
  • Partition by hash

Partition by range.

Le partitionnement "by range" convient parfaitement pour historiser les données. Cela permet d'organiser les données selon un intervalle dans le temps (jours, mois, trimestre ,année). 
Il est fréquent que les grosses tables soient intérrogées par periode. Dans ce cas la Oracle utilisera le critère de partitionnement pour n'accèder qu'à une petite partie des données.

Partition by list.

Le partitionnement par liste s'effectue surtout sur des colonnes à faible cardinalité. C'est à dire dont le nombre de valeur distinctes est peu elevé. Attention, contrairement au "partition by range" et"partition by hash", la clé de partitionnement ne peut concerner qu'une seule colonne.

Partition by hash. 

Le partitionnement par hash permet de distribuer les données selon un algorithme qu'Oracle applique en fonction de la colonne partionné. L'idée est qu'Oracle répartie les données de façon égale en les différentes partitions. Pour que le répartion soit homogène il faut bien évidemment choisir une clé de hash qui elle même soit répartie de facon homogéne dans la table.
Par exemple, si j'ai une table de facture et que je partitionne par hash sur l'information client en décidant de créer 64 partitions alors que je n'ai que deux clients distincts avec 90 % de facture pour un client et 10 pour l'autre le choix de partitionnement par hash est à revoir. Il aurait mieux fallu choisir un partitionnement par liste. 
En revanche, si j'ai un millier de clients avec environ le même nombre de factures par client, on aurra une répartition homogène. Pour le partitionnement par hash, Oracle recommande fortement que le nombre de partition soit une puissance de 2 !

Remarque : Avec cet article, ca fait deux fois que j'indique qu'ORACLE recommande que pour une partition par hash, le nombre de partitions soit une puissance de deux.

Alors je peux me poser la question de lapertinence de cette recommandation. Elle a le mérite de venir d'Oracle. Mais bon nombres de concepts sont appliqués dans des applications dites sensibles sans que leur origine ou bienfondé soit vérifié.
Alors il n'est certe pas possible de toujours tout vérifier, mais dans de nombreux cas, cela ne prends que quelques minutes. Alors que dans quelques mois (après de grandes aventures...), il sera beaucoup plus compliqué de faire marche arrière, même si on est convaincu que ce qui est en place est "bancal".

Revenons à nos moutons.
Crééons deux tables partitionnées par hash une avec 4 ( 2^2) partitions et une autre avec 5 partitions.


CREATE TABLE t_part_4 (i number)
PARTITION BY HASH(i) PARTITIONS 4;

CREATE TABLE t_part_5 (i number)
PARTITION BY HASH(i) PARTITIONS 5;



Je vais maintenant remplir t_part_4 avec 500000 lignes ayant une valeur comprise entre 1 et 10000. 



BEGIN
   FOR z IN 1..500000 LOOP
      INSERT INTO t_part_4 VALUES (ROUND(DBMS_RANDOM.VALUE(1,10000)));
   END LOOP;
END;
COMMIT;
/



Remplissons t_part_5 avec les données de t_part_4 (ne laissons pas de place au hasard).



INSERT INTO t_part_5 SELECT * FROM t_part_4;
COMMIT;



Collectons les statistiques pour mes deux tables


BEGIN
   DBMS_STATS.GATHER_TABLE_STATS(user,'t_part_4');
   DBMS_STATS.GATHER_TABLE_STATS(user,'t_part_5');
END;


 
Par rapport à la définition d'une partition de hash (si on omet la recommandation d'ORACLE)
on devrait en théroie avoir 100000 lignes par partitions pour t_part_5 et 125000 lignes par partition pour t_part_4.

Vérifions


SELECT Table_Name,Partition_Name,Num_Rows FROM User_Tab_Partitions
WHERE Table_Name IN ('T_PART_4','T_PART_5')
ORDER BY Table_Name,Partition_Position;



Résultat :
Dans le cas de t_part_4 mes données sont plutôt bien réparties : Respectivement 124669,125539,125028,124395 lignes pour chacunes des partitions.
En revanche pour t_part_5, j'ai 126777,123979,124801 lignes pour les partitions 2,3,4 et 63206 ert 59725 pour les partitions 1 et 5.
Nous venons de montrer facilement que le conseil d'ORACLE n'etait pas annodin.

 
Attention : Je ne dis pas que toutes les recommandations d'ORACLE sont fondées ou se confirment / infirment facilement. Je veux simplement attirer votre attention sur le fait que sur le web on trouve de tout (y a même des gens comme moi qui écrivent des articles sur ORACLE). Et qu'il convient de faire la part des choses. Bon nombre de personnes aiment à s'appeler expert parcequ'elles ont réussi à faire fonctionner un bout de code trouvé de la toile.
Pour reprendre un des principes de Tomas Kyte (Oh grand tout puissant, maitre incontésté de la technologie Oracle): "Ne croyez pas ce que vous lisez ou entendez, experiementez dans vos environnements et vos problématiques, ce qui est valable dans bien des cas ne le sera peut être pas pour vous.Ne cherchez pas de règles magiques, elles n'existent pas , et chaque règle que vous trouverez aura son exception (comme dans la langue francaise)."
 
LAO.
Partager cet article
Repost0