Conception Et Réalisation (SQL Server) by Grare Stéphane - HTML preview

PLEASE NOTE: This is an HTML preview only and some elements such as links or page numbers may be incorrect.
Download the book in PDF, ePub, Kindle for a complete version.

valeurlimite

Marque la frontière de chaque partition

Quelques exemples :

CREATE PARTITION FUNCTION

maPremiereFonction (INT)

AS RANGE RIGHT FOR VALUES (1000, 2000, 3000);

Cette fonction à comme paramètre un entier et dit : « Je partitionne dès que l'entier que

tu m’as spécifié atteint 1000, 2000 ou 3000 ». La clause AS RANGE LEFT|RIGHT

montre juste à quelle partition va aller le point de partitionnement.

Dans l’exemple suivant, nous créons 3 valeurs pivots portant sur des dates.

CREATE PARTITION FUNCTION DateCommande (DATE)

AS

RANGE RIGHT

FOR VALUES ('2009-01-01', '2010-01-01', '2011-01-01');

On a donc créé 3 valeurs pivot ce qui impose au moins 4 partitions :

• Partition 1, de - l'infini à 2008-12-31

• Partition 2, de 2009-01-01 à 2009-12-31

• Partition 3, de 2010-01-01 à 2010-12-31

• Partition 4, de 2011-01-01 à + l'infini

RANGE RIGHT signifie que la valeur borne est incluse dans la partition à droite.

Schéma de partitionnement

Un schéma de partitionnement spécifie les zones de partitionnement physiques (alors

que la fonction de partitionnement désigne les points logiques) et les associe à la

fonction de partitionnement.

On crée un schéma de partition pour faire correspondre les groupes de fichiers qui

contiendront les partitions aux valeurs indiquées par la fonction de partition à l'aide de

l’instruction Transact-SQL CREATE PARTITION SCHEME.

CREATE PARTITION SCHEME nom_schema_partition

AS PARTITION nom_fonction_partition

[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )

Un exemple : Utilisation de la fonction de partition définie précédemment pour subdiviser

la table en 3 partitions basées sur 3 groupes de fichiers déjà existants dans la base.

72

index-73_1.png

CREATE PARTITION SCHEME partSchema

AS PARTITION maPremiereFonction

TO (Groupe1, Groupe2, Groupe3)

Cette commande effectue les opérations suivantes :

Les données entre 0 et 1000 seront stockées dans Groupe1,

Les données entre 1001 et 2000 seront stockées dans Groupe2,

Les données entre 2001 et l'infini seront stockés dans Groupe3.

Si la proposition "les données entre x et y" n'est pas clair, c'est normal, c'est la troisième

étape.

SQL Server 2008 permet l’utilisation du mot clé ALL qui autorise toutes les partitions

définies par la fonction de partition à être créées dans un seul groupe de fichiers. Si vous

n’utilisez pas le mot clé ALL, alors le schéma de partition doit contenir au moins un

groupe de fichiers pour chaque partition définie dans la fonction de partition.

Prenons l’exemple de notre base de données « BaseDeTest » où nous avions créé 5

groupes. Nous allons créer un schéma de partitionnement en utilisant la fonction

DateCommande vu à la section précèdent.

CREATE PARTITION SCHEME SchemaDateCommande

AS PARTITION DateCommande

TO (Groupe1, Groupe2, Groupe3, Groupe4, Groupe5);

Notez que le schéma de partitionnement fait référence à la fonction de partitionnement.

Il inclut les 5 espaces de stockage définis précédemment, c'est-à-dire les 4 nécessaires

au schéma de partitionnement, et un storage supplémentaire de réserve pour des

travaux ultérieurs.

Partitionner des tables et des index

Dernière et ultime étape, nous allons comprendre pourquoi nous avons fait les étapes 1

et 2. La syntaxe pour créer une table partitionnée est la suivante :

CREATE TABLE

73

[ database_name . [ schema_name ] . | schema_name . ] table_name

( { <column_definition> | <computed_column_definition> }

[ <table_constraint> ] [ ,...n ] )

[ ON { partition_scheme_name ( partition_column_name ) | filegroup

| "default" } ]

[ { TEXTIMAGE_ON { filegroup | "default" } ] [ ; ]

Un exemple :

CREATE TABLE MaTable (

PK INT IDENTITY(1,1) PRIMARY KEY,

NOM NVARCHAR(50),

PRENOM NVARCHAR(80)

)

ON partSchema(PK)

GO

Ce que nous venons de faire : Créer une table toute bête et lui associer le schéma de

partitionnement crée précédemment avec la clé primaire (le int) comme paramètre de

fonction de partitionnement. En clair : Tous les enregistrements avec clé primaire

inférieure ou égale à 1000 iront dans le Groupe1, les enregistrements avec 1001 inférieur

à PK et inférieur ou égale à 2000 dans Groupe2…

Reprenons notre base de données « BaseDeTest ». Nous avons créé une fonction de

partition, un schéma de partition mappé sur la fonction de partition. Dernière étape :

CREATE TABLE Commandes

(NUMCOM SMALLINT NOT NULL IDENTITY(1,1),

NOMCLIENT VARCHAR(30) NOT NULL,

PRENOMCLIENT VARCHAR (35) NOT NULL,

DATCOM DATE NOT NULL)

ON SchemaDateCommande(DATCOM)

La table créée possède une colonne qui servira de partitionnement ayant un type DATE

et non NULLable.

C'est cette colonne qui est passée en argument de la fonction de partition de la clause

ON pour préciser que la table est stockée sur un système partitionné.

Imaginez juste ça à plus grande échelle avec des groupes dans des disques séparés.

Voilà l'utilité du partitionnement !

SELECT sur des tables partitionnées

Vous avez la possibilité de faire des requêtes sur des partitions ! Vu que le

partitionnement est un mécanisme tout à fait transparent pour les personnes utilisant les

tables, il serait embêtant pour vous, DBA qui avez partitionné la table, de parcourir toute

la table avec un SELECT en sachant pertinemment que les données que vous cherchez

sont dans une partition X.

74

index-75_1.png

index-75_2.png

index-75_3.png

index-75_4.png

index-75_5.png

Il est possible de cibler une partition (ou plusieurs) dans votre SELECT grâce à

l'instruction $PARTITION. Exemple :

SELECT * FROM MaTable WHERE $PARTITION.ma_fonction_de_partition(cle) = 3

Cette instruction nous retourne tous les enregistrements de la partition numéro 3.

Prenons un exemple concret, celui de la base de données « BaseDeTest ». Nous nous

baserons sur le jeu d’essai suivant :

Nous souhaitons connaître toutes les lignes de la table Commandes de la partition 3.

SELECT * FROM Commandes WHERE $PARTITION.DateCommande(DATCOM) = 3

Nous voulons savoir sur quel numéro de partition est stocké l'enregistrement concernant

la date de commande du 09/01/2008 :

SELECT $partition.DateCommande('2008-01-09') as [numero partition];

De la même manière :

SELECT $partition.DateCommande('2009-11-10') as [numero partition];

SELECT $partition.DateCommande('2010-01-12') as [numero partition];

SELECT $partition.DateCommande('2011-11-10') as [numero partition];

75

index-76_1.png

index-76_2.png

On constate donc que l’enregistrement des commandes respecte donc bien notre

partitionnement qui est pour rappel :

• Partition 1, de - l'infini à 2008-12-31

• Partition 2, de 2009-01-01 à 2009-12-31

• Partition 3, de 2010-01-01 à 2010-12-31

• Partition 4, de 2011-01-01 à + l'infini

Mais comment connaître le numéro de la partition ??? Et bien c'est tout simple, la

requête suivante vous donne tous les numéros de partition de votre table :

SELECT $partition.DateCommande(DATCOM) AS [numeroPart], count(*) [nombre de

lignes]

FROM Commandes GROUP BY $partition.DateCommande(DATCOM)