10-21 Rushmore, améliorer les performances de VFP en utilisant Rushmore
# 0000000750
ajouté le 05/04/2010 13:44:51 et modifié le 05/04/2010
consulté 10153 fois
Niveau
initié
Version(s) Foxpro : VFP 9.0 VFP 8.0 VFP 7.0
Le téléchargement des pièces jointes est limité aux membres Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description
Ci-joint rushmore.zip contenant :
les programmes et données démontrés pendant la session / atelier du vendredi matin.
nos bibliothèques ab... contenant près de 400 méthodes et fonctions utilitaires (décrites dans "ab.xls")
Ce code est distribué en open source à notre communauté (voir mention en tête de chaque prg)
Il sera bientôt sur un serveur subversion pour faciliter le partage du code.
* ================== CASE m.tiCase < 0 CLEAR * Exécuter tous les cas de test
rushmore(0, .T.)
rushmore(0)
rushmore(1)
rushmore(2)
rushmore(3)
rushmore(4)
rushmore(5)
rushmore(6)
* ================== CASE m.tiCase = 0
? [SET FILTER -vs- SCAN -vs- SELECT-SQL]
? "http://fox.wikis.com/wc.dll?Wiki~rushmore"
? ["Rushmore can optimize the SET FILTER command,]
? [and any command involving a FOR clause, as well as SELECT-SQL."]
lnSecs = Seconds() SELECT * FROM VEH WHERE MARQUE = 'AUDI'INTOCURSOR (Sys(2015)) NOFILTER
lnRecs = 0 SCAN
lnRecs = m.lnRecs + 1 ENDSCAN USE
CaseDisplay('SELECT-SQL', m.lnRecs, m.lnSecs)
* ================== CASE m.tiCase = 1
? [Index = Expression -vs- Index == Expression]
? "http://fox.wikis.com/wc.dll?Wiki~UnderstandingRushmore~VFP"
? ["If any filter expression in a SQL command uses ==,]
? [the result set is not filtered,]
? [FoxPro always creates a PHYSICAL CURSOR"]
* ================== CASE m.tiCase = 3
? [Influence de Set("Deleted") et de l'index sur Deleted()]
IF lTag('DELETD') DELETETAG DELETD ENDIF
CaseSelect(Textmerge([Sans index sur Deleted(), SET DELETED <<Set('Deleted')>>]))
LOCAL loDeleted
loDeleted = CreateObject('abSet', 'DELETED', 'OFF')
CaseSelect(Textmerge([Sans index sur Deleted(), SET DELETED <<Set('Deleted')>>])) RELEASE loDeleted
INDEXONDeleted() TAG DELETD BINARY
CaseSelect(Textmerge([Avec index sur Deleted(), SET DELETED <<Set('Deleted')>>]))
* ================== CASE m.tiCase = 4
? 'Influence de Set("Collate")'
CaseSelect(Textmerge([SET COLLATE TO '<<Set("Collate")>>']))
lcCollate = Set("Collate") SETCOLLATETO'General'
CaseSelect(Textmerge([SET COLLATE TO '<<Set("Collate")>>'])) SETCOLLATETO'&lcCollate'
* ================== CASE m.tiCase = 5
? 'Index sur une UDF'
? "http://fox.wikis.com/wc.dll?Wiki~UnderstandingRushmore~VFP"
? [When you create an index on a UDF (user defined function)];
+ [, SQL can use this index]
CaseSelect([Table enfant VEH et deux tables parent MARQUE & REF filtrées];
, [VEH.MARQUE = 'AUDI' AND MARQUE.MARQUE = 'AUDI' AND REF.PRODUIT = 'RAR'], .T.)
OTHERWISE
? Textmerge([Le cas n° <<m.tiCase>> n'est pas supporté]) ENDCASE
SETALTERNATETO SETALTERNATEOFF
* ------------------- FUNCTION UDF(tu) && Fonction d'indexation RETURN m.tu
* ------------------- PROCEDURE CaseSelect && Exécute le SELECT LPARAMETERS ;
tcCase,; && Cas d'exécution
tcFilter,; && Condition de filtre
tlJoin,; && Ajouter les jointures
tlNoFilter && Forcer la création d'un fichier
tcCase = Evl(m.tcCase, 'Index = Expression')
tcFilter = Evl(m.tcFilter, [VEH.MARQUE = 'AUDI'])
LOCAL lnSelect, lcSelect, lnSecs, lnRecs
lnSelect = Select(0)
lcSelect = [SELECT VEH.* FROM VEH]
IF m.tlJoin USEINSelect('MARQUE') USE MARQUE IN 0 EXCLUSIVE USEINSelect('REF') USE REF IN 0 EXCLUSIVE
lcSelect = m.lcSelect + [ JOIN MARQUE ON VEH.IMARQUE = MARQUE.IMARQUE JOIN REF ON VEH.REF = REF.REF] ENDIF
lcSelect = Textmerge([<<m.lcSelect>> WHERE <<m.tcFilter>>])
* Exécuter une première fois pour charger les index en mémoire
&lcSelect INTOCURSOR (Sys(2015)) USE
* Exécuter pour de bon
lnSecs = Seconds()
lnRecs = VFPSelectExecute(m.lcSelect,,,m.tlNoFilter,.T.) && cf. abData.prg
CaseDisplay(c2Words('SELECT-SQL' + Iif(m.tlNoFilter, ' NOFILTER', ''), ' - ', m.tcCase), m.lnRecs, m.lnSecs) USE