> Tech > Clause Order by ….

Clause Order by ….

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Si cette colonne de séquencement n’est pas référencée sur la clause ORDER BY , DB2 UDB ignorera la clause SEARCH toute entière.

Rappelons que, avec SQL, si l’on veut renvoyer des données dans un certain ordre, seule une clause ORDER BY le garantira.

Si le président a demandé cette liste des subordonnés de Carfino simplement pour leur envoyer un courriel les félicitant pour la réussite d’un récent projet, il n’est pas nécessaire de spécifier une clause SEARCH qui ralentirait le traitement récursif de DB2 UDB.

En revanche, si le président est nouveau et s’il ne connaît pas bien la chaîne hiérarchique de Carfino, alors l’application,devrait spécifier la clause SEARCH et ORDER BY pour présenter les employés dans l’ordre en profondeur d’abord, comme le montre la figure 13. Les RCTE seront plus performantes sans la clause SEARCH. Ne l’incluez que s’il faut contrôler l’ordre de traitement quand l’application requiert un ordre spécifique des relations de données ou des hiérarchies.

Il est une partie d’une expression de table commune récursive dont je n’ai pas encore parlé : la clause CYCLE. Parfois , vos tables contiendront des relations de données récursives qui sont cycliques ou sans fin. Dans une hiérarchie d’entreprise, on ne risque pas le cycle sans fin, parce que le président n’est jamais subordonné à un employé de niveau inférieur. En revanche, considérons une table telle que la table des vols de la figure 14, qui contient les combinaisons de vols pour un ensemble de villes. Voici la définition de table SQL qui correspond à la figure 14 : CREATE TABLE flights(departure VARCHAR(40),arrival VARCHAR(40),carrier CHAR(20)) Supposons que vous vouliez écrire une requête SQL récursive pour connaître toutes les destinations possibles à partir d’une ville de départ, comme Rochester. Dans ce cas, votre requête SQL récursive sera chargée de trouver une destination telle que Minneapolis, qui a aussi un vol direct vers Rochester. Si l’instruction SQL ne détecte pas le fait que Rochester en point de départ conduira la requête à traverser vers une destination Rochester, la requête entamera une boucle sans fin. C’est exactement le rôle que vient jouer la clause CYCLE dans la figure 15.

Juste après le mot-clé CYCLE, se trouve le nom de la colonne que DB2 UDB devrait examiner pour s’assurer que la RCTE n’entre pas dans un cycle sans fin. Sur le mot-clé SET, on fournit une colonne afin que DB2 UDB puisse marquer les chemins cycliques qu’il a trouvés pendant l’exécution de la RCTE. Dans cette requête, la colonne cyclic_data sera mise à la valeur chaîne de « 0 » pour des résultats non cycliques et de « 1 » pour les éventuels chemins cycliques trouvés par DB2 UDB. La sortie de cette requête SQL récursive (figure 16) montre aussi que l’on peut inclure la colonne cyclic_data dans le jeu de résultats final.  

 

Dans cet exemple, la dernière ligne du jeu de résultats aété marquée comme cyclique et le traitement s’est terminé parce que Chicago a été « visité » une seconde fois dans cettecombinaison de correspondances. DB2 UDB a pu détecter ce cycle sans fin parce que la colonnespécifiée sur la clause CYCLE , arrival, a fait que le moteur de base de données s’est assuré qu’aucunevaleur dans la colonne arrival n’était traitée deux fois sur une seule combinaison decorrespondances. Vous vous demandez peut-être pourquoi lacinquième ligne du jeu de résultats (Rochester -> Chicago -> Minneapolis -> Rochester) n’a pas été marquée comme cyclique parce que Rochester apparaît deuxfois dans cette liste de correspondances. Cette sortie non cyclique montre bien que la vérification de cycle n’est faiteque sur le tronçon récursif(c’est-à-dire le texte violet) de la RCTE. Rappelons que la première valeur Rochester a été fournie par le tronçon d’initialisation (c’est-à-dire en texte vert).

Vous pouvez aussi référencer la colonne cyclique sur une clause ORDER BY de la même manière que vous pouvez référencer la colonne de séquencement sur la clause SEARCH.

De plus, vous pouvez choisir un nom quelconque pour la colonne cyclique. Vous avez aussi une certaine latitude dans le choix des valeurs attribuées à la colonne cyclique, en respectant la limite de longueur d’un octet pour les chaînes de caractères. L’important ici est de penser à inclure la clause CYCLE quand il peut y avoir des données cycliques dans vos tables, pour éviter des requêtes SQL récursives sans fin.

 

 

 

 

Téléchargez cette ressource

Préparer l’entreprise aux technologies interconnectées

Préparer l’entreprise aux technologies interconnectées

Avec la « quatrième révolution industrielle », les environnements hyperconnectés entraînent de nouveaux risques en matière de sécurité. Découvrez, dans ce guide Kaspersky, comment faire face à cette nouvelle ère de vulnérabilité.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010