Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Renvoyer toutes les lignes d'une partition spécifique dans SQL Server (T-SQL)

Lorsque vous créez une table partitionnée dans SQL Server, vous spécifiez les valeurs qui vont dans chaque partition.

Cela se fait lorsque vous créez la fonction de partition. Lorsque vous créez la fonction de partition, vous spécifiez des valeurs limites, qui déterminent quelles valeurs vont dans chaque partition.

Une fois que vous avez créé votre table partitionnée et que vous avez inséré des données, vous pouvez exécuter un SELECT normal pour renvoyer des données, comme vous le feriez avec une table non partitionnée (en fait, même les tables non partitionnées ont une partition).

Mais saviez-vous que vous pouvez également spécifier la partition à partir de laquelle vous souhaitez obtenir des données ?

Vous pouvez le faire à l'aide de la $PARTITION fonction système dans votre WHERE clause.

Exemple

Imaginons que nous ayons une table partitionnée contenant les données suivantes :

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Et CatId est la colonne de partitionnement.

Et nous avons utilisé la fonction de partition suivante pour créer ses partitions :

CREATE PARTITION FUNCTION CatsPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 5, 100);

Cela nous indique comment les données sont stockées, en fonction des valeurs de la colonne de partitionnement.

Nous pouvons donc maintenant exécuter une requête qui ne renvoie que les données d'une partition spécifique.

Renvoyer les données de la seconde partition

Voici comment nous pouvons renvoyer toutes les lignes de la deuxième partition.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 2;

Résultat :

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
+---------+-------------+

Renvoyer les données de la troisième partition

Et voici toutes les données de la troisième partition.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 3;

Résultat :

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 6       | Sharp     |
| 7       | Fritz     |
| 8       | Garfield  |
| 9       | Boss      |
+---------+-----------+

Renvoyer les données des première et dernière partitions

Dans ce cas, ma première partition est vide, car il n'y a pas de valeurs négatives dans le CatId colonne.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 1;

Résultat :

(0 rows affected)

De même, la dernière partition est également vide, car il n'y a pas assez de lignes pour remplir cette partition.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 4;

Résultat :

(0 rows affected)

Cela respecte la recommandation de Microsoft de laisser les première et dernière partitions vides, afin d'éviter tout mouvement de données dans le cas où les partitions seraient scindées ou fusionnées à l'avenir.