Partager l'article ! Performance - Partitionnement (1): Bonsoir, Me revoici avec ma table de 115 millions de lignes (j'ai perdu accidentellement celle de 125 millions ...
Par ailleurs, je m'étais arreté à décembre 2007, mais bien evidemment tous les jours les statistiques arrivent de part nos 25 pays et continuent d'alimenter notre
table.
Pas besoin d'être fort en mathématiques pour comprendre:
décembre 2007=115 millions de lignes
Années 2008 => Plus d' UN MILLIARD DE LIGNES.
L'idée étant de conserver bien sur l'année en cours + une année d'archive: Au bas mot 2,5 milliards de lignes !!
Les intérrogations seront essentiellement par date et par quesionnaire.
Il convient de bien réfléchir à comment stocker ces informations car les manipulations de centaines de millions de lignes ne s'effectuent pas de la même facon que pour une table de quelques
milliers de lignes.
Tout devient critique (Statistiques, sauvegarde, maintenance des indexes,...)
Pour les tables à forte volumétrie ORACLE a bien sur pensé à nous, et il a créé le partitionnement.
Cela va revenir à découper notre table selon des critères bien précis.
Il existe trois type de partitionnement:
Dans mon cas, Etant donnée que je vais interroger la table par date et par questionnaire, il peut être jucieux d'effectuer un partitionnement par intervalle sur la
date, suivi d'un sous partitionnement par questionnaire. Pour le sous partitionnement, on utilisera un partitionnement par hash.
Afin de permettre à ORACLE d'utiliser au mieux son algorythme de répartition des valeurs, il convient de choisir un nombre de sous partitions qui soit une puissance de 2(
4,8,16,32,64,128,...)
En général les deux raisons qui poussent à effectuer du partionnement sont:
Pour ce qui est de l'administration on en reparlera dans un prochain article.
Pour les performances, c'est assez simple à comprendre.
Admettons que je fasse une requête du type
Si ma table est partitionnée par date et sous partitionné par type de formulaire, ORACLE va utiliser cette information pour aller directement dans la partition concernée et va donc travailler sur
un sous ensemble de la table.
Assez parlé, crééons une nouvelle table qui prennent en compte le partitionnement.
(
q1 number,
q2 number,
q3 number,
q4 number,
q5 number,
q6 number,
q7 number,
q8 number,
q9 number,
q10 number,
id_pays number,
id_formulaire number,
date_questionnaire number)
PARTITION BY RANGE(date_questionnaire) SUBPARTITION BY HASH(id_formulaire) SUBPARTITIONS 64
(
PARTITION P_20071201 VALUES LESS THAN (20071202),
PARTITION P_20071202 VALUES LESS THAN (20071203),
PARTITION P_20071203 VALUES LESS THAN (20071204),
PARTITION P_20071204 VALUES LESS THAN (20071205),
PARTITION P_20071205 VALUES LESS THAN (20071206),
PARTITION P_20071206 VALUES LESS THAN (20071207),
PARTITION P_20071207 VALUES LESS THAN (20071208),
PARTITION P_20071208 VALUES LESS THAN (20071209),
PARTITION P_20071209 VALUES LESS THAN (20071210),
PARTITION P_20071210 VALUES LESS THAN (20071211),
PARTITION P_20071211 VALUES LESS THAN (20071212),
PARTITION P_20071212 VALUES LESS THAN (20071213),
PARTITION P_20071213 VALUES LESS THAN (20071214),
PARTITION P_20071214 VALUES LESS THAN (20071215),
PARTITION P_20071215 VALUES LESS THAN (20071216),
PARTITION P_20071216 VALUES LESS THAN (20071217),
PARTITION P_20071217 VALUES LESS THAN (20071218),
PARTITION P_20071218 VALUES LESS THAN (20071219),
PARTITION P_20071219 VALUES LESS THAN (20071220),
PARTITION P_20071220 VALUES LESS THAN (20071221),
PARTITION P_20071221 VALUES LESS THAN (20071222),
PARTITION P_20071222 VALUES LESS THAN (20071223),
PARTITION P_20071223 VALUES LESS THAN (20071224),
PARTITION P_20071224 VALUES LESS THAN (20071225),
PARTITION P_20071225 VALUES LESS THAN (20071226),
PARTITION P_20071226 VALUES LESS THAN (20071227),
PARTITION P_20071227 VALUES LESS THAN (20071228),
PARTITION P_20071228 VALUES LESS THAN (20071229),
PARTITION P_20071229 VALUES LESS THAN (20071230),
PARTITION P_20071230 VALUES LESS THAN (20071231),
PARTITION P_20071231 VALUES LESS THAN (20080101)
) ;
Et bien je réponds, qu'avec ce sujet, j'ai de quoi remplir mon blog pour novembre !!!!
LAO.
| Février 2012 | ||||||||||
| L | M | M | J | V | S | D | ||||
| 1 | 2 | 3 | 4 | 5 | ||||||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | ||||
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | ||||
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | ||||
| 27 | 28 | 29 | ||||||||
|
||||||||||
On peut toujours vouloir automatiser en créeant par exemple un job mensuel ou annuel qui va créer les partitions automatiquement. Cependant, cela fait partie du boulot du DBA, qui en plus au moment d'ajouter les nouvelles partitions va devoir eventuellement réorganiser son espace (nouveau tablesapace, purge d'anciennes partitions obsoletes,..).
Typiquement si on doit gérer des partitions "par journée", on pourra découper les taches d'administration par mois ou trimestre, voir par année en fonction de la volumétrie de l'accessabilié aux données. En effet dans le cas de dataware house ou les données sont statiques, on a grand interet à placer rapidement le maximum de tablespace en READ ONLY.
Cela nous permetra d'optimiser les sauvegardes.
Pour rappel, tous les exemples sont fait sur une version 10 Release 2..
Ce qui laisse entendre que ORACLE 11 apporte du nouveau.
LAO.
Je confirme que le partionnemet est efficace, voir nécessaire sur des environnements ou l'on parle en TERA. Par ailleurs sur la partie Index, as tu déjà jeté un oeil sur l'article qui parle des indexes locaux (http://www.lao-dba.com/article-25050126.html).
Le partitionnement et l'indexation sont complémentaires, sauf que dans mon exemple étant donné que je requete sur les colonnes de partitionnement, la partition se substitue en quelque sorte à l'index. Mais il ne faut pas perdre de vue que l'on peut indexer les autres colonnes.
La table comporte bien 31 souspartitions.
Pourquoi le choix du nombre 64 et pas 32 par exemple ?
Merci d'avance.
Je réalise avoir mal formulé ma question.
Il y aurait bien 31 partitions par range.
Vous indiquez 64 sous partitions. Pourquoi 64 et où sont-elles ces sous partitions ?
Merci
64, 32,128 effectivement, j'aurai pu choisir une autre valeur. Mais l'objet du blog est d'aborder des concepts et en prenant des exemples non issue du monde de la production, il n'est pas toujours aisé de justifier un choix parmis un autre. Il faut savoir que l'on utilise le partionnement à la fois pour une maintenance plus facile, et également dans un souci d'amélioration des performances. Dans le cas des performances, Partitionnement rime avec parallelisme, et donc dans certains cas, c'est le nombre de processeurs qui va dicter le choix du nombre de sous-partitions. Il va de soit que la volumétrie a également son importance.
Pour ce qui est des infos sur les sous-partitions, vous pouvez interrroger les vues systemes user_tab_subpartitions et dba_tab_subpartitions.
LAO.