83
4.2 Partitionnement
Comme vous le voyez, au lieu de créer la table sur un groupe de fichiers, nous la
créons sur le plan de partitionnement. Nous donnons en paramètre la colonne sur
laquelle le partitionnement aura lieu, ce qui porte le nom de clé de partitionnement.
Cette clé ne peut être composite : elle doit être contenue dans une seule colonne.
Pour que cet exemple fonctionne, nous devons « tricher » et supprimer la clé primaire, car nous ne pouvons pas aligner notre index unique sur le partitionnement de
la table. Nous reviendrons sur cette problématique quand nous aborderons le sujet
des index au chapitre 6. Sachez simplement que les index peuvent être aussi partitionnés. Par défaut, les index suivent le même plan de partitionnement que la table,
ils sont dits « alignés ». Mais ils peuvent aussi être partitionnés différemment, ou
n’être pas partitionnés et résider intégralement sur un seul groupe de fichiers. Ce
choix explicite doit être indiqué dans l’instruction de création de l’index, comme
nous le voyons dans le code précédent.
Alimentons ensuite la table :
INSERT INTO Sales.SalesOrderHeader_Partitionne
(
RevisionNumber, OrderDate, DueDate, ShipDate, Status,
OnlineOrderFlag, PurchaseOrderNumber,
AccountNumber, CustomerID, ContactID, SalesPersonID,
TerritoryID, BillToAddressID,
ShipToAddressID, ShipMethodID, CreditCardID,
CreditCardApprovalCode, CurrencyRateID,
SubTotal, TaxAmt, Freight, Comment, rowguid, ModifiedDate
)
SELECT RevisionNumber, OrderDate, DueDate, ShipDate,
Status, OnlineOrderFlag, PurchaseOrderNumber,
AccountNumber, CustomerID, ContactID, SalesPersonID,
TerritoryID, BillToAddressID,
ShipToAddressID, ShipMethodID, CreditCardID,
CreditCardApprovalCode, CurrencyRateID,
SubTotal, TaxAmt, Freight, Comment, rowguid, ModifiedDate
FROM Sales.SalesOrderHeader;
Nous pouvons voir ensuite comment les lignes ont été attribuées aux partitions
par les vues système d’allocation :
SELECT object_name(object_id) AS Name,
partition_id,
partition_number,
rows,
allocation_unit_id,
type_desc,
total_pages
FROM sys.partitions p JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id=object_id('Sales.SalesOrderHeader_Partitionne')
ORDER BY partition_number;
Cette requête est d’utilité publique, et peut être utilisée pour toute table, même
non partitionnée. Elle permet de connaître les attributions de pages selon les dif-
4.2 Partitionnement
Comme vous le voyez, au lieu de créer la table sur un groupe de fichiers, nous la
créons sur le plan de partitionnement. Nous donnons en paramètre la colonne sur
laquelle le partitionnement aura lieu, ce qui porte le nom de clé de partitionnement.
Cette clé ne peut être composite : elle doit être contenue dans une seule colonne.
Pour que cet exemple fonctionne, nous devons « tricher » et supprimer la clé primaire, car nous ne pouvons pas aligner notre index unique sur le partitionnement de
la table. Nous reviendrons sur cette problématique quand nous aborderons le sujet
des index au chapitre 6. Sachez simplement que les index peuvent être aussi partitionnés. Par défaut, les index suivent le même plan de partitionnement que la table,
ils sont dits « alignés ». Mais ils peuvent aussi être partitionnés différemment, ou
n’être pas partitionnés et résider intégralement sur un seul groupe de fichiers. Ce
choix explicite doit être indiqué dans l’instruction de création de l’index, comme
nous le voyons dans le code précédent.
Alimentons ensuite la table :
INSERT INTO Sales.SalesOrderHeader_Partitionne
(
RevisionNumber, OrderDate, DueDate, ShipDate, Status,
OnlineOrderFlag, PurchaseOrderNumber,
AccountNumber, CustomerID, ContactID, SalesPersonID,
TerritoryID, BillToAddressID,
ShipToAddressID, ShipMethodID, CreditCardID,
CreditCardApprovalCode, CurrencyRateID,
SubTotal, TaxAmt, Freight, Comment, rowguid, ModifiedDate
)
SELECT RevisionNumber, OrderDate, DueDate, ShipDate,
Status, OnlineOrderFlag, PurchaseOrderNumber,
AccountNumber, CustomerID, ContactID, SalesPersonID,
TerritoryID, BillToAddressID,
ShipToAddressID, ShipMethodID, CreditCardID,
CreditCardApprovalCode, CurrencyRateID,
SubTotal, TaxAmt, Freight, Comment, rowguid, ModifiedDate
FROM Sales.SalesOrderHeader;
Nous pouvons voir ensuite comment les lignes ont été attribuées aux partitions
par les vues système d’allocation :
SELECT object_name(object_id) AS Name,
partition_id,
partition_number,
rows,
allocation_unit_id,
type_desc,
total_pages
FROM sys.partitions p JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id=object_id('Sales.SalesOrderHeader_Partitionne')
ORDER BY partition_number;
Cette requête est d’utilité publique, et peut être utilisée pour toute table, même
non partitionnée. Elle permet de connaître les attributions de pages selon les dif-
