Je pense que ce serait une question assez simple, mais j'ai en fait eu du mal à trouver une réponse à cela.
La question: pouvez-vous déplacer des lignes de données dans une table partitionnée d'une partition à une autre en mettant simplement à jour la colonne de partition afin qu'elle traverse la frontière de la partition?
Par exemple, si j'ai une table qui a une clé de partition:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Avec la fonction de partition qui correspond à la clé primaire:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Puis-je déplacer une ligne de la première partition à la troisième partition en changeant le SampleID de 1 à (disons) 500 000?
Remarque: Je marque ceci comme serveur SQL 2005 et 2008, car ils prennent tous les deux en charge le partitionnement. Le traitent-ils différemment?
$PARTITION
calcule uniquement le numéro de partition en fonction de l'entrée; il ne teste pas réellement où la rangée vit physiquement.Pour tester cela, l'expérience doit réellement partitionner la table. Voir http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
L'interrogation de la fonction de partitionnement vous indique simplement ce que dit la fonction de partitionnement. Il ne dit pas où les données sont stockées. Vous pouvez configurer une fonction de partitionnement et l'exécuter sans réellement partitionner une table, comme cela a déjà été démontré ici.
Pour partitionner la table, vous devez également créer des groupes de fichiers et un schéma de partitionnement qui utilise la fonction de partitionnement pour affecter des résultats de fonction aux groupes de fichiers. Ensuite, vous devez mettre une clé en cluster sur la table qui utilise ce schéma de partitionnement.
Configurer le partitionnement
Je ne suis pas un expert en ligne de commande SQL. J'ai utilisé l'interface SSMS pour configurer les groupes de fichiers pfg1 (avec un fichier pf1) et pfg2 (avec un fichier pf2). Ensuite, j'ai déclaré la fonction et le schéma de partitionnement:
Créer la table et l'index clusterisé
Après cela, lorsque vous interrogez sys.partitions (j'ai 2005), vous voyez que la table a maintenant deux partitions au lieu d'une seule pour la table. Cela indique que nous avons entièrement implémenté le partitionnement pour cette table.
Maintenant que nous avons deux partitions (avec un nombre de lignes pour chacune), nous pouvons mener une expérience.
Insérez les lignes
Vérifiez les partitions sys.pour voir ce qui s'est passé.
Oui. Une ligne dans chaque partition.
Déplacez une rangée.
Vérifiez les partitions
La première partition a maintenant deux lignes au lieu de 1, et la deuxième partition a zéro ligne au lieu de deux.
Je pense que cela confirme que la ligne a été automatiquement déplacée suite à la modification de la clé en cluster dans une table partitionnée.
la source
Je ne pense pas que cette réponse soit correcte. Lorsque vous utilisez la valeur
vous recalculez simplement ce que devrait être la partition, et non l'emplacement actuel de l'enregistrement.
Tu devrais utiliser:
Dans mes tests sur sql 2005, la valeur change mais le record reste dans la même partition. Cela gâchera probablement les statistiques et l'optimiseur car il s'exécutera en mode multi-thread, en attendant qu'une partition soit dans une plage spécifique. Il sera également complètement faux lorsqu'il essaiera d'utiliser l'élimination de partition pour interroger uniquement la partition appropriée. Je pense que vous devez supprimer et réinsérer chaque enregistrement pour les faire bouger.
la source
$partition
ici suggère que la réponse acceptée est correcte. Comment confirmez-vous que l'enregistrement reste dans la même partition après sa mise à jour?