Bonjour,
Je teste depuis quelques jours, de partitionner 2 tables de ma BDD afin d'accélérer l'exécution de certaine de mes procédure stockée. Cependant Après de nombreux test je n'arrive pas à trouver la bonne configuration de partitionnement ce qui résulte d'une perte de performance notable au niveau de l'exécution de ma requête.
Je vais poser le problème.
Je possède 2 tables de fortes volumétries
La première table étant la plus petite appelé table A, comportant 25millions de lignes (environ 1GO) et qui augmente de jours en jours.
La seconde table B de 276millions de lignes (environ 11GO)
Les deux tables représente 2 ans de données.
Chacune des lignes des deux tables possède un attribut qui est la date d'insertion dans la table.
J'ai ensuite une procédure stockée qui va sélectionner certaines valeurs comprises dans ces deux table pour une période donnée, généralement 1 mois.
J'ai donc voulu partitionner mes deux tables, en créant une partition par mois et en utilisant la date comme clé de partition(J'incrémenterais chaque mois à l'aide d'un SPLIT) et en créant un index partitionné (primary key ou nouvel index).
Cependant je n'ai pas pus révélé de gains important de performance. J'ai plutôt observé une dégradation des performances.
Je tiens à préciser que toute mes partition sont sur le même disque physique. Je sais qu'il faudrait que chacune des partitions soient sur un disque physique différent, cependant j'ai déjà 25 partitions et l'utilisation d'autant de disques n'est pas envisageable.
Malgré tout j'ai observé des gains de performance au niveau de ma requête dans certains cas.
Voici une de mes requêtes (très, très simplifiée pour l'occasion):
Elle va extraire 1 jours de donnée. En faisant un test je m'aperçois qu'elle s'exécute en 1min15 sur les tables partitionnées, et en 1min30 sur les tables non partitionnées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6 FROM B INNER JOIN A ON B.date = A.date WHERE A.date BETWEEN '01/03/2009' AND '01/03/2009'
Si j'essaie d'extraire 2 jours, la requête s'exécute en 4min sur les tables partitionnée et 1min50 sur les tables non partitionnées.
L'execution plan me le confirme en donnant un 'query cost' plus faible pour la requête sur table partitionné pour l'extraction d'un jours de donnée et l'inverse pour 2 jours.
Je me demande donc si la performance des partitions lors de la récupération de donné a un lien avec la quantité de donnée parcouru. Ou si ce phénomène est simplement dût au fait que les partitions sont sur le même disque.
Ou est ce que finalement le partitionnement n'est pas adapté dans mon cas.
Je vous sollicite donc pour m'aider à résoudre et comprendre mon problème et si jamais il existe une autre solution pour accélérer mes requête, je suis preneur.
Cordialement
Partager