Contact: 514-605-7112 / info@lecfomasque.com

performance des fonctions récursives

Ce sujet a 0 réponse, 1 participant et a été mis à jour par  alexis.bourdeau, il y a 1 mois et 1 semaine.

Affichage de 1 message (sur 1 au total)
  • Auteur
    Messages
  • #57154

    alexis.bourdeau
    Participant

    Bonjour

    Je suis nouveau ici et sur les techno Microsoft !

    J’ai besoin de quelques conseils sur les fonctions récursives Power Query.

    je dois faire l’action suivante :

    J’ai une table de 300 000 lignes depuis une source SQL.
    Je la requète et ajoute une colonne d’index.

    Ensuite,
    je dois mettre à jour la colonne QTY_NEEDED, ligne après ligne,
    selon la valeur NUM_OF de la ligne précédente et aussi selon une variable de boucle calculé chaque tour (= quantitySoFar).
    – je met à jour la ligne seulement si la valeur NUM_OF de la ligne précédente est égal à NUM_OF de la ligne en cours
    – la nouvelle valeur deQTY_NEEDED est 0 si quantitySoFar est plus grand que QTY_TOSERVE sinon c’est QTY_TOSERVE – quantitySoFar
    – quantitySoFar est mis à jour aussi dans chaque tour de récursion, si la valeur précédente de NUM_OF est différente de la valeur NUM_OF en cours, c’est (QTY_STOCK – QTY_TOSERVE), sinon c’est (quantitySoFar – QTY_TOSERVE)

    je l’ai codé et ça marche
    sauf que c’est très lent à s’exécuter sur toute la table. Ce n’est pas fini après 1h (j’ai arrété le calcul, je ne sais pas si ça finit)

    avez vous des idées pour améliorer le code ?
    (moins de colonne dans la requete SQL ? utiliser autre chose que « ReplaceValue » ? buffer si possible ?

    Merci !

    let
    Source = dsBigSQL_OLEDB_DEV,
    DynSQL = Value.NativeQuery (Source, »
    SELECT

    NUM_OF,
    QTY_NEEDED,
    QTY_TOSERVE,
    QTY_STOCK,
    DATE,

    15 columns
    FROM

    WHERE

    ORDER BY NUM_OF, DATE

    « ),
    # »AddedIndex » = Table.AddIndexColumn(DynSQL, « Index », 1, 1),

    updateTableLineByLine = (numRow, TableSoFar, quantitySoFar) as table =>
    let
    // table size
    rowcount = Table.RowCount(TableSoFar),
    // get from the previous row and the current row : NUM_OF, QTY_NEEDED
    previousRow = Table.SelectRows( TableSoFar, each [Index] = numRow-1 ),
    currentRow = Table.SelectRows( TableSoFar, each [Index] = numRow ),

    previousNumOF = previousRow[NUM_OF]{0},
    currentQuantityNeeded = currentRow[QTY_NEEDED]{0},
    currentQuantityToServe = currentRow[QTY_TOSERVE]{0},
    // Compute the new value of QTY_NEEDED and local variable quantitySoFar here
    quantitySoFar = quantitySoFar – currentQuantityToServe
    newQuantityNeeded = if … then … else …

    // Update the column QTY_NEEDED ONLY for the current row (=> column Index = numRow) and only if NUM_OF of previous equal NUM_OF of current row
    TableWithNewValue = Table.ReplaceValue(TableSoFar,
    each Record.Field(_, »QTY_NEEDED »),
    each if Record.Field(_, »Index ») = numRow && Record.Field(_, »NUM_OF ») = previousNumOF then newQuantityNeeded else Record.Field(_, »QTY_NEEDED ») ,
    Replacer.ReplaceValue,
    {« QTY_NEEDED »}
    ),

    TableRecursive = if numRow +1 > rowCount then TableWithNewValue else @updateTableLineByLine(numRow +1, TableWithNewValue, quantitySoFar)

    in
    TableRecursive ,

    result = updateTableLineByLine(2, AddedIndex, 0)

    in
    result

Affichage de 1 message (sur 1 au total)

Vous devez être connecté pour répondre à ce sujet.