SQL HF : booster une requete select where IN

Date 10/10/2002 1:20:00 | Sujet : Trucs et astuces

Confronté en 147J à des problèmes de limites d'item dans les liste de la clause IN des select, un truc est surgit lors de nos tests...

La clause IN dans la condition d'un select permet de fixer une liste des valeurs possibles pour une rubrique.
Reste qu'il ne vaut mieux pas avoir trops d'éléments dans la liste sous peine de voir l'execution de la requete s'éterniser...

La solution est trés simple. Elle consiste à ne pas utiliser la fontionnalité IN du SQL HF mais plutot un fichier temporaire et une simple jointure normale. Le gain de temps à l'execution nous a laissé sans voix.

En fait on envoies la liste dans une fichier temporaire décrit dynamiquement.

// Ajoute le fichier temporaire dans le spectre les objet du projet
EXTERNE TMP
// Décrit le fichier temporaire en fonction de la rubrique en relation
dfic est une description de fichier
drub est une description de fichier
dfic..nom="TMP"
dfic..nomphysique=replocal+"TMP"
drub..nom="CLE"
drub..type=FICHIER.RUBRIQUELISTEE..type
drub..taille=FICHIER.RUBRIQUELISTEE..taille
drub..TypeClé=hCléDoublon // pour indexer le fichier temporaire
HDécritRubrique(dFic,drub)
HAnnuleDéclaration("TMP")
HDécritFichier(dFic)
HCréation(TMP)
// Reste ensuite à remplir le fichier temporaire avec les valeurs de la liste
hRAZ(TMP)
TMP.CLE="..."
hAjoute(TMP)
// contrôles inutiles le fichier n'est lié à rien et la propriété nomphysique vous permet de le créer en local


Et on réalise la requete


MonSQL est une chaine
MonSQL = "Select * from FICHIER,TMP where FICHIER.RUBRIQUELIEE=TMP.CLE"
hExécuteRequeteSQL(MesDonnée,MonSQL)
...


Voilà, dans notre cas on est passé pour un petit fichier de 40 lignes et une liste de 20 valeurs d'environ 20s à qq dizièmes.

Comme quoi, il existe parfois des solutions simples pour améliorer les choses.

@+ R&B








Cet article provient de WDForge.org
http://old.wdforge.org

L'adresse de cet article est :
http://old.wdforge.org/article.php?storyid=42