280
Chapitre 8. Optimisation du code SQL
SELECT * FROM dbo.testloop
Cette méthode est relativement peu sûre, car elle se base sur une implémentation
physique non documentée, et potentiellement non consistante au fil des versions.
Elle est néanmoins pratique. Depuis SQL Server 2005, les fonctions de fenêtrage
permettent de réaliser la même opération, avec en plus la capacité de gérer précisément un ordre, et un regroupement par la valeur d’autres colonnes (c’est pour cette
raison que nous avons créé la colonne groupe dans la table). Le problème est que
nous ne pouvons utiliser une fonction de fenêtrage que dans un SELECT. Nous pouvons contourner cette limitation à l’aide d’une expression de table :
WITH cteTestLoop AS (
SELECT
id,
ROW_NUMBER() OVER(ORDER BY id) as rownumber
FROM dbo.testloop
)
UPDATE tl
SET nombre = ctl.rownumber
FROM dbo.testloop tl
JOIN cteTestLoop ctl ON tl.id = ctl.id;
Cet exemple effectue exactement la même mise à jour, mais avec garantie de
l’ordre par la colonne ID. Cette méthode est officielle et sûre, par contre vous pourriez encore utiliser la solution à base de variable dans les cas où le tri ne vous importe
pas, pour des raisons de performance pure. Voyez la différence de plan d’exécution
sur la figure 8.18. La version CTE doit créer un plan compliqué, avec une jointure
sur la même table, un tri et une table de travail (table spool).
Figure 8.18 — Plan des requêtes de mise à jour
Précédent

- 292/334

Suivant