78
Chapitre 4. Optimisation des objets et de la structure de la base de données
exemple qui utilise la structure de contrôle TRY CATCH qui n’existe que depuis la version 2005 1 :
BEGIN TRANSACTION
BEGIN TRY
SELECT *
INTO Sales.SalesOrderHeader_Archive2002
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) = 2002
DELETE
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) = 2002
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
Vous pouvez simplifier cet exemple à partir de 2005 à l’aide de l’instruction
DELETE … OUTPUT. La lecture des lignes n’est ainsi effectuée qu’une seule fois :
BEGIN TRANSACTION
BEGIN TRY
SELECT
0 as SalesOrderID, RevisionNumber, OrderDate, DueDate, ShipDate
INTO Sales.SalesOrderHeader_Archive2002
FROM Sales.SalesOrderHeader
WHERE 1 = 2 2
DELETE
FROM Sales.SalesOrderHeader
OUTPUT DELETED.SalesOrderID, DELETED.RevisionNumber,
DELETED.OrderDate, DELETED.DueDate, DELETED.ShipDate
INTO Sales.SalesOrderHeader_Archive2002
WHERE YEAR(OrderDate) = 2002
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
Que faire de cette nouvelle table d’archive ? Vous pouvez modifier vos applications clientes pour ajouter par exemple un bouton de recherche sur les archives, qui
1. L’utilisation d’une fonction dans le critère de recherche empêche l’utilisation éventuelle d’un
index. Nous le verrons dans la partie traitant de l’optimisation des requêtes. Dans ce cas, c’est peu
problématique, dans la mesure où un scan de la table sera de toute manière effectué, le nombre de
ligne à retourner étant important.
2. Nous avons volontairement raccourci dans notre exemple le nombre de colonnes, car dans ce
cas nous devions éviter de copier la colonne SalesOrderID comme colonne de type IDENTITY
(auto-incrémentale). L’OUTPUT refusant d’insérer une valeur explicite dans un IDENTITY.
Précédent

- 90/334

Suivant