Une requête SQL peut mettre en action de nombreuses tâches : parcours, filtrage, tri, union, sélection... La fonction EXPLAIN permet d'obtenir le détail du plan d'exécution d'une requête (cf. nouveauté 124 de HFSQL).
Voici un exemple d'utilisation, à partir d'un cas concret. Avec une requête SQL "NATURAL JOIN" je tente d'obtenir toutes les rubriques des fichiers CLIENT et COMMANDE reliés par une rubrique NumClient. Le code SQL de ma requête est des plus simple, directement saisi dans l'éditeur de requêtes :
A l'exécution de la requête, en test depuis l'éditeur, ou avec la fonction HExecuteRequete, aucune ligne ne remonte. Pourtant il y a bien des enregistrements qui vérifient l'égalité CLIENT.NumClient = COMMANDE.NumCommande. Un EXPLAIN de la requête exécuté via le centre de contrôle HFSQL, ou directement dans le code de clic d'un bouton de test permet de tout de suite comprendre le résultat obtenu :

// Code de clic sur un bouton de test ...
ReqExplain est une Source de Données

HExécuteRequêteSQL(ReqExplain,"EXPLAIN "+REQ_NATURAL..CodeSQL)
HLitPremier(ReqExplain)
Info(HRécupèreEnregistrement(ReqExplain))

Le résultat obtenu dans le presse-papier avec ce code :
L'explication des filtres permet immédiatement de comprendre. Il y a bien la rubrique "NumClient" qui a été utilisée pour mettre en correspondance les enregistrements des deux fichiers, mais également la rubrique "Observations". En effet par définition le "NATURAL JOIN" utilise le nom de toutes les rubriques communes aux tables pour effectuer la jointure, j'avais oublié la présence de cette rubrique...
L'exemple WD Analyseur Explain HFSQL inclus avec WINDEV (dossier \Exemples\Exemples didactiques\) permet d'obtenir une représentation graphique du résultat en plus de la description XML renvoyée par défaut.
Conclusion :
  • pratique le EXPLAIN qui montre tout de suite ce qui est fait lors d'une interrogation,
  • bien vérifier les rubriques des tables avant un NATURAL JOIN. Et surtout, après l'ajout de rubriques par la suite, bien vérifier si il n'y a pas un impact sur les jointures naturelles des requêtes existantes (personnellement, j'évite les NATURAL JOIN pour cette raison).

- Mise à jour 17/10/2019 -

Le centre de contrôle HFSQL propose depuis la version 24 d'un EXPLAIN automatique lorsque l'on exécute une requête sur une table, ou différentes tables d'une base de données.

< Retour

Publier un commentaire : 
Votre adresse email ne sera pas publiée