ven. 29 janvier 2016, 10h42
FoxInCloud (Th. Nivelet)
France
atoutfox.public.association
Re: Bases SQL et multi-threading
Pour suivre sur cette question, j'ai trouvé une excellente solution : cursorAdapter.BeforeCursorFill()
Cette méthode m'a permis de bâtir une requête SQL adaptée à chaque utilisateur qui, au lieu d'une cascade de conditions logiques comme dans le SQL de la vue, n'injecte que les conditions strictement nécessaires à chaque utilisateur.
La requête qui n'était pas optimisable avec une vue à cause des OR (Optimizable OR Not Optimizable = Not Optimizable), devient optimisable à tous les coups.
Cette méthode m'a aussi permis d'ajouter des conditions de filtre contextuelles supplémentaires, telle que des bornes de dates afin de limiter le nombre d'enregistrements : d'abord une requête de comptage, ultra rapide, puis le calcul des plages de dates - mois, trimestres ou années - limitant à 1.000 enregistrements par plage.
Au final la requête est passée de 10 secondes -- dans le pire des cas -- à 50 ms.
A mon sens le cursorAdapter (CAD) offre le meilleur de 2 mondes: la vue (paramétrée) et le SQL direct (pass-through pour une base distante):
- comme une vue il s'occupe des mises à jour (where type, key field, etc., et aussi .noDataOnLoad)
- on peut contruire la requête dynamiquement comme avec le SQL direct
- en ajoutant le CAD au dataEnvironment et en définissant bien son .cursorSchema, on conserve l'intellisense sur les champs comme avec une vue dans le DE.
Franchement c'est une excellente surprise -- j'ai encore bien du grain à moudre avec VFP9!
Le sam. 09 janvier 2016, 11h15 FoxInCloud a écrit :
> Merci Michel
>
> Je vais optimiser en VFP avant de passer à SQLserver
Permalink : http://www.atoutfox.org/nntp.asp?ID=0000017235