mardi 27 mars 2012

Optimisation du Update Set Row

La clause Set Row permet de faire des updates d'une table à partir d'un record PL/SQL. La syntaxe utilisée permet d'avoir un code très clair.

Voici un petit exemple illustrant ce principe :

vMyVariable  MyTable%RowType;

Update MyTable tab
Set Row = vMyVariable;
Where tab.Id = 5;

Il est également possible de faire un insert utilisant cette variable de la manière suivante :

Insert MyTable 
Values vMyVariable;

Cependant, l'update via un set row met à jour toutes les colonnes de la table (même la clé primaire) même si cette valeur reste inchangée. La requete équivalente à l'update ci dessus est la suivante :

Update MyTable tab
Set tab.r1 = 1,
    tab.r2 = 2,
    tab.r3 = 3,
    ...
Where tab.Id = 5;
Il n'y a pas besoin de longues explications pour comprendre que dans le cas d'une large table cela peut couter cher de mettre à jour toutes les colonnes si on ne doit juste mettre à jour une ou 2 colonnes.

Pour contrer ce problème, il suffit de définir un subset de la table à mettre à jour. Oracle comprendra alors qu'il ne doit mettre à jour que les colonnes selectionnées par la sous-requete. Il faudra aussi définir un type ne contenant que les colonnes que l'on souhaite mettre à jour. La requete suivante permet de faire ce que l'on souhaite :

update (Select v.r1,tab.r2 from MyTable tab where tab.id = 5)
       Set Row = vMyVariable;


Ainsi seules les colonnes que l'on a définie dans la sous requete sont mises à jour !

Aucun commentaire:

Enregistrer un commentaire