Alors permettez-moi de préférer en disant que je n'ai pas de contrôle total sur ma conception de DB, de sorte que de nombreux aspects du système actuel ne peuvent pas être modifiés aux fins de ce scénario.
Commentaires sur la façon dont nous devrions repenser les aspects de la conception sont probablement corrects mais inutiles :)
J'ai une très grande table, environ 150 champs de large et environ 600 m rangs, qui conduit un grand nombre de processus. Ceci est dans une situation d'entrepôt de données, nous n'avons donc pas de mises à jour/insertions en dehors du processus de charge planifiée, il est donc fortement indexé.
Une décision a été prise pour essayer de partitionnement de ce tableau et j'ai des préoccupations concernant l'indexation d'une table partitionnée. Je n'ai aucune expérience avec partitionnement, donc toute entrée ou liens sont appréciés. Je ne pouvais pas localiser spécifiquement ce que je suis après sur Bol ou MSDN.
Nous nous clusterons actuellement sur un champ que nous appellerons IncidentKey
qui est une varchar(50)
et non unique - nous aurions pu avoir entre 1 et 100 enregistrements avec le même IK
(non Commentaires s'il vous plaît). Nous obtenons souvent de nouvelles données sur Old IncidentKey
enregistrements, donc ce n'est pas séquentiel non plus.
Je comprends que j'ai besoin d'inclure mon champ de partition, IncidentDate
, dans ma clé d'index en cluster pour la partition de fonctionner correctement. Je pense que ce serait IncidentKey, IncidentDate
.
La question est de savoir comment la mécanique d'un indice en cluster sur une clé 2 pièces dans une table partitionnée, si un enregistrement dans une partition "nouvelle" doit être enregistré dans une partition "ancienne" dans l'index en clustere?
Par exemple, j'ai 5 enregistrements:
IncidentKey Date
ABC123 1/1/2010
ABC123 7/1/2010
ABC123 1/1/2011
XYZ999 1/1/2010
XYZ999 7/1/2010
Si je reçois un nouvel enregistrement pour ABC123, 2/1/2011
Il aura besoin d'être dans l'index en cluster [~ # ~] avant [~ # ~ ~]XYZ999, 1/1/2010
. Comment cela marche-t-il?
Je suppose que la fragmentation et les pointeurs, mais je ne trouve aucune information sur le stockage physique et la configuration des index clusters non partitionnés sur des tables partitionnées avec des clés à double pièce.
Une table partitionnée est vraiment plus comme une collection de tables individuelles cousues ensemble. Donc votre par exemple de regroupement par IncidentKey
et partition par IncidentDate
, disons que la fonction de partitionnement divise les tables en deux partitions de sorte que le 1/1/2010 soit en partition 1 et 7/1/2010 est la partition deux. Les données seront exposées sur le disque comme suit:
Partition 1:
IncidentKey Date
ABC123 1/1/2010
ABC123 1/1/2011
XYZ999 1/1/2010
Partition 2:
IncidentKey Date
ABC123 7/1/2010
XYZ999 7/1/2010
À un niveau bas, il y a vraiment deux lignes distinctes. Est le processeur de requête qui donne l'illusion d'une seule table en créant des plans qui recherchent, numérisez et mettez à jour tous Rowsets ensemble, comme un.
Toute ligne de tout index non clustered aura la clé d'index en cluster à laquelle elle correspond, disons ABC123,7/1/2010
. Étant donné que la clé d'index en cluster contient toujours la colonne de clés de partitionnement, le moteur saura toujours dans quelle partition (Rowset) de l'index en cluster à la recherche de cette valeur (dans ce cas, dans la partition 2).
Maintenant, chaque fois que vous avez affaire à partitionnement, vous devez prendre en compte si vos index NC seront alignés (l'indice NC est partitionné exactement identique à celui de l'indice en cluster) ou non aligné (l'indice NC n'est pas partitionné, ou partitionné différemment de l'indice en cluster.) . Les index non alignés sont plus flexibles, mais ils ont des inconvénients:
L'utilisation des indices alignés résout ces problèmes, mais apporte son propre ensemble de problèmes, car cette conception physique, de stockage, option des ondulations dans le modèle de données:
Ces effets que j'ai trouvés rarement appelés au début d'un projet qui déploie un partitionnement, mais ils existent et ont de graves conséquences.
Si vous pensez que les index alignés sont un cas rare ou extrême, considérez ceci: Dans de nombreux cas, la pierre angulaire des solutions d'ETL et de partitionnement est l'interrupteur rapide des tables de stadification. L'interrupteur dans les opérations nécessite des index alignés.
Oh, une chose de plus: tout mon argument sur les clés étrangères et l'effet d'ondulation de l'ajout de la valeur de colonne de partitionnement à d'autres tables s'applique également à .
Lorsqu'un index en cluster a plusieurs partitions, chaque partition a une structure B-Tree contenant les données de cette partition spécifique. Par exemple, si un indice en cluster a quatre partitions, il existe quatre structures B-Tree; un dans chaque partition. Réf. structures d'index en cluster
Directives spéciales pour les index partitionnés
Vous pouvez reconstruire des partitions spécifiques d'un index partitionné.
par exemple.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO