Partitionnement SQL Server - quoi utiliser pour la clé de partition?


10

Je n'ai jamais travaillé avec le partitionnement SQL Server mais je suis actuellement confronté à la conception d'une base de données pour laquelle les volumes le justifient probablement. Le système est destiné aux coupons. Les coupons doivent être émis périodiquement, généralement toutes les six semaines, mais il y aura également une émission ponctuelle - par exemple pour un événement spécial. Il y a 15 millions de clients et pour chaque événement d'émission, chaque client recevra 6 types de coupons différents, ce qui donne un total de 90 millions d'instances de coupons. Nous devons suivre les données de rachat des instances de coupons et les conserver pendant 6 mois, bien que généralement un coupon ne soit valide que pendant six semaines. Toute demande de rachat pour un coupon non valide n'atteindra pas la base de données car elle sera validée par le TPV jusqu'au.

Sur une période de six mois, nous devrons stocker jusqu'à 360 millions de lignes dans le tableau Instance du coupon et jusqu'à 72 millions (en supposant un taux de remboursement maximal de 20%) dans le tableau de remboursement. J'ai l'impression que ces chiffres sont trop gros pour une seule partition?

Ma question est - quoi utiliser comme clé de partition? Un candidat évident serait par événement d'émission, donnant environ 6 partitions. Mais alors je pense que peut-être même cela donnerait une taille de partition trop grande pour permettre des performances optimales? Serait-il possible de partitionner par deux clés, par exemple par événement d'émission + dernier chiffre de l'identifiant client? La logique serait donc:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

De plus, je ne suis pas sûr de la spécification du serveur de base de données dont nous aurons besoin. Les 16 Go et 8 processeurs seront-ils suffisants? La base de données doit être en mesure de renvoyer un résultat de la table d'instances de coupons, saisie sur une valeur de code-barres numérique en moins d'une demi-seconde. La demande de transaction attendue pour valider (sélectionner) et racheter (insérer) devrait culminer à environ 3 500 par minute.

Le serveur SQL Server 2008r2 64 bits db sera provisionné en tant que machine virtuelle à partir d'un hôte très puissant avec accès à un SAN hautes performances et de grande capacité.

Je serais très reconnaissant pour tout conseil de ceux qui ont déployé une solution SQL Server pour gérer des volumes similaires.

Cordialement

Rob.


2
Vos tables sont encore petites - pas besoin de partitions, j'ai une table avec quelques milliards de lignes sans partition, ça marche. Les partitions sont bien pour FAST DROP, cependant.
TomTom

1
Nonsense @TomTom, les partitions peuvent être avantageuses lorsque le nombre de lignes en compte une fraction. Certes, le schéma de partition doit être avantageux pour les modèles d'accès afin de réaliser un gain de performances, mais une couverture "pas de BESOIN" à cette taille est tout simplement fausse.
Mark Storey-Smith,

1
Non, c'est correct. BESOIN! = Avantage. NEED est lorsque vous rencontrez des problèmes lors de l'exécution de requêtes sans partitions.
TomTom

1
Hey @TomTom Je pense que vous avez besoin d'un petit copain de rupture, c'est un peu fort, même si ce n'est pas vraiment offensant. Je suis d'accord avec Mark StoreySmith, une couverture "pas besoin" est tout à fait erronée, mais votre affirmation selon laquelle elle n'est probablement pas nécessaire est correcte. J'imagine que c'est une question d'indexation. Je sais aussi que Mark sait ce que vous entendez par besoin vs avantage. Coupez-nous tous un peu et relâchez la caféine, k? (Et croyez-moi, je suis connu pour avoir très peu de patience certains jours, surtout des jours comme aujourd'hui où je prends des analgésiques pour mon dos)
jcolebrand

Réponses:


14

Les questions relatives aux spécifications du serveur doivent être adressées à Serverfault ou DBA.SE.

Pour la question du partitionnement, je ne pense pas que vous ayez nécessairement besoin de partitionner pour cela.

360m de lignes c'est beaucoup mais ce n'est pas trop lourd.

Ne pas en aucun cas essayer de partition en fonction du dernier chiffre d'un champ. Je ne suis pas sûr que cela fonctionnerait même, mais ce n'est pas SARGable qui ne serait pas tenable.

Si vous n'avez besoin d'effectuer qu'une seule recherche de ligne basée sur une clé numérique, le partitionnement n'aidera probablement pas.

Si vous décidez de poursuivre la route de partition, n'oubliez pas que pour être efficace, toutes vos requêtes doivent inclure vos clés de partition afin que le moteur sache quelle partition vérifier. Sinon, il les vérifiera tous et vous nuire aux performances.



Je suis également d'accord. Parfois, vous avez juste besoin de meilleurs index.
jcolebrand

Je suis en désaccord avec @JNK. Une recherche de ligne unique basée sur une clé numérique qui bénéficie de l'élimination de la partition réduit les E / S. Si les modèles d'accès sont tels que les partitions fréquemment utilisées restent dans le pool de mémoire tampon par rapport aux partitions rarement utilisées, vous bénéficiez d'autres avantages en termes de performances. Et nous n'avons même pas abordé ma fonctionnalité préférée que le partitionnement vous offre, une disponibilité partielle.
Mark Storey-Smith,

Pour mémoire, sur vos autres points, je suis entièrement d'accord :)
Mark Storey-Smith

@ MarkStorey-Smith - Cela dépendra de sa clé. Tel que défini actuellement dans l'OP, la partition n'ajoutera aucune valeur. Il semble également qu'il ne pourra pas utiliser une clé en deux parties avec un champ de date ou un schéma de partition "normal".
JNK

5

Vous POUVEZ partitionner sur plusieurs clés si vous utilisez une colonne calculée persistante; comme d'autres l'ont dit, cependant, le partitionnement ne fonctionne pas dans toutes les situations. Je ne suis pas sûr de bien comprendre votre scénario pour vous donner des conseils spécifiques, mais voici quelques directives générales:

  • Le partitionnement est utile pour lire les données lorsque la clé de partitionnement fait partie de l'instruction SQL, ce qui permet à l'optimiseur d'invoquer l'exclusion de la partition. Vous devez vous assurer que la clé que vous choisissez est utile pour la plupart des requêtes.

  • L'un des avantages d'une bonne stratégie de partitionnement est le vieillissement des données; par exemple, si votre clé de partition est basée sur la date (c'est-à-dire le jour de l'année) et que vous souhaitez supprimer toutes les données antérieures à une certaine date, il est très facile de basculer ces partitions vers une table vide et de les tronquer.


4

Vous devez vraiment définir vos besoins un peu plus clairement. Vous mentionnez que vous aurez environ 360 millions de lignes en 6 mois. Et dans 2 ans? Allez-vous encore croître uniquement au rythme que vous êtes en train de croître. Ou y a-t-il une chance que vous connaissiez une croissance exponentielle. Voulez-vous conserver les données dans ce tableau pour toujours; ou souhaitez-vous archiver régulièrement des données.

Le partitionnement peut être utilisé pour l'archivage des données. Voir scénario de fenêtre coulissante. Voir ce livre blanc et celui-ci .

Le partitionnement peut également être utilisé pour gérer la fragmentation d'index. Vous pouvez reconstruire / réorganiser des partitions particulières.

Vous devez également considérer les vues partitionnées par opposition aux tables partitionnées. Les vues partitionnées ne nécessitent pas de licence SQL Server Enterprise. Les vues partitionnées vous permettent également d'effectuer des reconstructions d'index en ligne sur une "partition" particulière.

Le partitionnement peut également être pris en compte lors de la planification de la reprise après sinistre. Il peut être utilisé pour la récupération partielle de la base de données. Par exemple: vous pouvez avoir vos anciennes partitions sur un groupe de fichiers différent de celui des partitions principales / actuelles. Et puis, lorsque vous récupérez, vous récupérez le groupe de fichiers principal, puis le groupe de fichiers sur lequel résident vos partitions actuelles et enfin vous pouvez restaurer les groupes de fichiers sur lesquels résident les anciennes partitions. Cela peut réduire le temps d'arrêt de votre application.

Découvrez cette superbe vidéo de Kimberly Tripp sur le partitionnement .


Nous n'avons besoin de conserver les données que pendant six mois. Chaque semaine, nous exécuterions un travail d'entretien ménager qui supprimerait tous les coupons émis plus de six mois auparavant.
Rob Bowman

3
Donc, fondamentalement, vous devez supprimer / supprimer environ 15 millions de lignes chaque semaine. Quelle est la largeur de la table? Je vous suggère de partitionner la table par colonne de date. De cette façon, les suppressions hebdomadaires seraient une simple méta-opération. Vous devez simplement basculer la plus ancienne partition de la table partitionnée principale vers une table intermédiaire. Déposez ensuite la table intermédiaire. C'est ce qu'on appelle le scénario Windows coulissant. Recherchez le premier livre blanc que j'ai publié, oh comment faire cela.
Dharmendar Kumar 'DK'

-2

Sauf si vous effectuez un partitionnement en raison de l'archivage d'anciennes données, vous le faites pour la mauvaise raison et ne devez pas le faire.


2
Il existe de nombreuses raisons d'utiliser le partitionnement en plus de l'archivage; l'exclusion de partition est très avantageuse pour de nombreux types de requêtes, si elle est utilisée correctement.
Stuart Ainsworth

Je suis d'accord avec Stuart, c'est un mauvais conseil.
jcolebrand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.