ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

10-21 Rushmore, améliorer les performances de VFP en utilisant Rushmore   



L'auteur

FoxInCloud (Th. Nivelet)
France France
Membre Simple
# 0000000014
enregistré le 13/10/2004

http://www.foxincloud.com/
Nivelet Thierry
75016 Paris
de la société Abaque
Fiche personnelle


Note des membres
pas de note

Contributions > 60 - AtoutFox > 2010 - Rencontres - Paris Roissy

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é 4374 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.
Code source :
  LPARAMETERS tiCase, tlRushmoreNot
    tiCase = Iif(Vartype(m.tiCase) == 'N', m.tiCase, 0)
    tlRushmoreNot = Vartype(m.tlRushmoreNot) == 'L' AND m.tlRushmoreNot

  LOCAL loTalk, lnSecs, lnRecs, lcCollate

  SET DEFAULT TO (JustPath(Sys(16,0)))
  AB() && charge les utilitaires Abaque
  loTalk = CreateObject('abSet''TALK''OFF'&& SET TALK ON ralentit SCAN...ENDSCAN
  SET PROCEDURE TO (Sys(16,0)) ADDITIVE
  SET ALTERNATE TO (ForceExt(Sys(16,0), 'log')) ADDITIVE
  SET ALTERNATE ON
  IF m.tlRushmoreNot
    SET OPTIMIZE OFF
  ELSE
    SET OPTIMIZE ON
  ENDIF


  USE IN Select('VEH')
  USE VEH IN 0 EXCLUSIVE
  SELECT VEH
  ?
  ? Replicate('=', 10), Datetime(), 'Cas'Transform(m.tiCase);
    , Iif(m.tlRushmoreNot AND m.tiCase = 0, 'SANS''AVEC'), 'Rushmore'Replicate('=', 10)
  ? Ltrim(Transform(Reccount(), '999 999')), 'enregistrements'

  DO CASE

  * ==================
  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()
    lnRecs = 0
    SET FILTER TO MARQUE = 'AUDI'
    GO TOP
    DO WHILE NOT Eof()
      lnRecs = m.lnRecs + 1
      SKIP
    ENDDO
    SET FILTER TO
    CaseDisplay('SET FILTER TO', m.lnRecs, m.lnSecs)

    lnSecs = Seconds()
    lnRecs = 0
    SCAN FOR MARQUE = 'AUDI'
      lnRecs = m.lnRecs + 1
    ENDSCAN
    CaseDisplay('SCAN FOR', m.lnRecs, m.lnSecs)

    lnSecs = Seconds()
    SELECT * FROM VEH WHERE MARQUE = 'AUDI' INTO CURSOR (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"]

    CaseSelect()
    CaseSelect(,,,.T.&& NOFILTER

    CaseSelect('Index == Expression'[MARQUE == 'AUDI'])
    CaseSelect('Index == Expression'[MARQUE == 'AUDI'],,.T.&& NOFILTER

  * ==================
  CASE m.tiCase = 2
    ? [Index = Expression -vs- Expression = Index]
    ? [VFP Help: "Using Rushmore Query Optimization to Speed Data Access"]
    ? ["A basic optimizable expression takes one of the two following forms :]
    ? [eIndex relOp eExp -or- eExpr relOp eIndex"]

    CaseSelect()

    CaseSelect('Expression = Index'['AUDI' = MARQUE])

  * ==================
  CASE m.tiCase = 3
    ? [Influence de Set("Deleted") et de l'index sur Deleted()]

    IF lTag('DELETD')
      DELETE TAG 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

    INDEX ON Deleted() 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")
    SET COLLATE TO 'General'
    CaseSelect(Textmerge([SET COLLATE TO '<<Set("Collate")>>']))
    SET COLLATE TO '&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()

    CaseSelect(Textmerge([Index/VFP Func <<cTagExpr('VFPF','VEH')>> = Expression]);
      , [Upper(VEH.MARQUE) = 'AUDI'])

    CaseSelect(Textmerge([Index/UDFunc <<cTagExpr('UDF','VEH')>> = Expression]);
      , [UDF(VEH.MARQUE) = 'AUDI'])

    CaseSelect(Textmerge([Expression = Index/UDFunc <<cTagExpr('UDF','VEH')>>]);
      , ['AUDI' = UDF(VEH.MARQUE)])

    CaseSelect(Textmerge([Index/UDFunc <<cTagExpr('UDF','VEH')>> = Expression]);
      , [VEH.MARQUE = UDF('AUDI')])

  * ==================
  CASE m.tiCase = 6
    ? 'Jointures : VEH >-- MARQUE & VEH >-- REF '

    CaseSelect([Table enfant VEH filtrée],, .T.)

    CaseSelect([Table enfant VEH et table parent REF filtrées];
      , [VEH.MARQUE = 'AUDI' AND REF.PRODUIT = 'RAR'].T.)

    CaseSelect([Deux tables parent MARQUE & REF filtrées];
      , [MARQUE.MARQUE = 'AUDI' AND REF.PRODUIT = 'RAR'].T.)

    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

  SET ALTERNATE TO
  SET ALTERNATE OFF

  * -------------------
  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
    USE IN Select('MARQUE')
    USE MARQUE IN 0 EXCLUSIVE
    USE IN Select('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 INTO CURSOR (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

  SELECT (m.lnSelect)

  * -------------------
  PROCEDURE CaseDisplay(tcStep, tnRecs, tnSecs)

  ? Padr(m.tcStep, 80, '.'); && STYLE 'B'
    , m.tnRecs PICTURE '999,999''enr.';
    , (Seconds() - m.tnSecs)*1000 PICTURE '999 999''ms'

  SYS(1104) && Purge Memory Cache && AJOUTÉ PENDANT LA SESSION

Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2018.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0