|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Bonjour à tous,
Je réfléchis actuellement sur la meilleure façon de structurer une table partitionée sur une base Oracle 10.2.0.4. C'est une table dans laquelle seront stockées des données de performance d'un parc de serveurs, les données sont collectées par serveur et par pas de 5 minutes. => PERF(collectdate, parc, serveur, valeur). On veut pouvoir répondre rapidement aux question suivantes : - perfs sur un intervalle de dates pour un ou plusieurs parcs. - perfs sur un intervalle de dates pour un ou plusieurs serveurs. L'intervalle de dates ne peut pas excéder 2 jours. Environ 1 million de lignes par jour y sont insérées, il existe 20 parcs différents et 4000 serveurs différents. Je souhaite conserver 1 an d'historique, donc environ 360 millions de lignes au total. Je me suis tourné vers le partitioning pour obtenir de meilleures perfs en selection. Les solutions sont multiples, et j'ai fait de nombreux tests avec 120 millions de lignes, seulement aucun ne donne de résultat vraiment tranché et au dessus du lot. Pour comprendre la suite : "moisjour" correspond à une colonne supplémentaire qui correspond à la concaténation du mois et du jour. De type NUMBER, elle servira de clé de partition, de cette manière j'aurai une partition par jour, et je crée les 367 partitions à la création de la table et n'ai pas besoin de retoucher aux partitions au fil du temps. Voici donc mes essais principaux, j'ai également fait de nombreux mix des ces solutions : Code :
Code :
Code :
Code :
Tout d'abord, la nouvelle colonne "moisjour" vous semble-t-elle justifiée/pertinente? Y a-t-il un autre moyen d'obtenir facilement un partitionnement par jour? Ensuite, quelle solution vous semble la meilleure (y compris une solution que je n'aurai pas exposée ici), et pourquoi? Lorsqu'on a le choix, y a-t-il une différence entre partitionnement BY LIST et BY RANGE? Des suggestions/conseils divers sur l'utilisation du partitioning? Voilà tout, en l'absence de nouveaux éléments je sais laquelle je retiendrai, mais les tests n'ayant rien donné de vraiment concluant, j'aurai aimé avoir des avis avant de me lancer. Merci d'avance pour vos réponses, et merci également d'avoir pris le temps de me lire! Si vous avez besoin de précisions n'hésitez pas. |
||||||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Est-ce qu'un serveur est unique dans son parc ?
Ou plutôt, est-ce que la PK est (collectdate, parc, serveur) ou (collectdate, serveur) ? Vu la structure relativement courte de la table, je partirai en fait sur une IOT partitionnée par jour. D'ailleurs la créer comme ça pourrait être performant : (parc, serveur, collectdate, valeur) Ça doit permettre d'activer la compression sur une ou deux colonnes. Au niveau de la partition, je ne rajouterai pas une colonne supplémentaire, je ferai plutôt un petit bloc PL/SQL lancé dans un JOB pour gérer les partitions. À moins que vous puissiez migrer en 11g où les partitions peuvent se créer toutes seules - mais j'imagine que c'est hors propos !
__________________
Email : http://scr.im/waldar |
|
10
|
|
|
#3 |
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Bonjour Waldar, merci pour votre réponse.
Non un serveur n'est pas unique dans son parc, il peut être rattaché à 1 ou n parcs. Et malheureusement je ne peux pas migrer en 11g. Pour la colonne supplémentaire, je pensais faire ça parce que le service dans lequel je suis n'a aucune compétence Oracle, donc s'il y a un problème de partition après mon départ ils auront du mal à le régler. Je vais de ce pas essayer votre proposition, avec et sans colonne supplémentaire pour comparer, et je reviens vers vous pour dire ce qu'il en est. Merci encore. |
|
|
00
|
|
|
#4 | ||||||||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Bon, me revoici après une longue série de test. Et j'ai à nouveau du mal à en tirer des conclusions claires. Désolé d'avance si mon post est un peu indigeste!
Donc, je suis à peu près sûr d'une chose, c'est que la solution de la table partitionnée organisée en index donne des résultats bien plus satisfaisants que les tables partitionnées classiques, quelle que soit la requête testée. Je vous remercie de m'avoir lancé sur cette piste. Par contre, sur certaines requêtes j'ai la nette impression que les performances sont même en dessous de la table classique. Ce qui m'amène à m'interroger sur deux choses : mon protocole de test, et la pertinence de la structure de mes tables. Pour mes tests, je crée mes tables puis les alimente avec 3 mois de données (~120m lignes), puis calcul complet des stats. Je lance une même requête sur chacune de mes tables, dans SQLPlus avec timing on et autotrace traceonly. Avant chaque requête je vide le shared_pool et le buffer_cache. Est-ce une manière correcte de procéder? En conseilleriez vous une autre? Ensuite la structure de mes tables. Je récapitule, en laissant de côté mes essais moins fructueux. - Table de base : Code :
Code :
Code :
Cette table est plus performantes lorsqu'on précise le parc, le bilan est plus mitigé lorsqu'il lui faut utiliser l'index (collectdate,serveur). Voici par exemple un tableau de stats pour une requête avec condition sur le serveur + un intervalle de date : Code :
Je vais peut être également essayer en ajoutant un partition by hash sur le serveur, à dire vrai je sais pas trop ce que ça peut donner. Si vous avez des conseils ou des questions n'hésitez pas. Et encore merci Waldar pour votre aide. |
||||||||
|
|
00
|
|
|
#5 |
![]() ![]() |
Il faudrait aussi comparer les plans d'exécution, car on a un nombre beaucoup plus important de lecture sur le disque avec les IOT1 et IOT2.
Je suis à peu près sûr que l'index sur collecdate n'est pas une bonne idée, vu que vous partitionnez par jour et que vous requêtez sur des intervalles de deux jours, ça ne me paraît pas très intéressant. Idéalement votre plan d'exécution doit d'abord identifier les partitions nécessaires (deux ou trois pour un intervalle de deux jours), puis éventuellement utiliser les index locaux. Je dis éventuellement car avec les IOT la table est déjà dans la PK, c'est donc une opération non nécessaire sur la majorité de vos critères ! J'imagine que la requête avec la table de base est la plus rapide car les restrictions parc / serveur sont plus discriminants que les restrictions au jour. Gardez à l'esprit qu'avec une IOT les autres index sont moins performants qu'en cas de table classique.
__________________
Email : http://scr.im/waldar |
|
10
|
|
|
#6 | ||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
En fait, l'intervalle dépend complètement de l'utilisateur, ça peut être une heure comme 2 jours.
L'interface par défaut propose les 24 dernières heures, c'est donc probablement le plus utilisé. Et en effet le plan d'execution se déroule comme ça, par exemple pour une journée et un serveur : Code :
(le range scan est sur l'index local (serveur,collectdate) et le unique sur l'index de clé primaire (parc,serveur,collectdate)) Question sans rapport direct, pensez vous que je devrais ajouter des sous-partitions "by hash" sur la colonne serveur? Je ne suis pas sûr que multiplier les partitions soit réellement bénéfique, et chaque nouvel essai coute beaucoup d'heures de tests! Merci encore pour votre participation. |
||
|
|
00
|
|
|
#7 |
![]() ![]() |
Avec une IOT il n'y a pas de table, juste la clef primaire, c'est donc ici l'équivalent du table scan.
Je n'ai jamais vraiment eu besoin de construire des sous-partitions, maintenant je ne me vois pas vous les déconseiller formellement. J'aurai dit que sur parc ça aurait été plus cohérent, mais si vos requêtes font surtout état du serveur l'index me paraît suffisant car le critère est fortement discriminant.
__________________
Email : http://scr.im/waldar |
|
10
|
|
|
#8 | ||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Bon, je vais donc partir sur cette solution de table organisée en index, qui offre d'assez loin les meilleures perfs moyennes pour l'ensemble des requêtes "témoins" :
Code :
Merci beaucoup pour votre aide! |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com