Projet

Général

Profil

Development #58013

Itérer sur les ids au lieu d'utiliser les curseurs nommés

Ajouté par Benjamin Dauvergne il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
20 octobre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Le principe est de récupérer d'abord la totalité des id des demandes, puis de lire les lignes de tables complètes par parquets (défini par itersize). itersize est par défaut à 200, on pourra l'augmenter à plus.

Ce mode d'itération est activé automatiquement quand on passe iterator=True à SqlMixin.select().

Ça supprime le besoin des connections isolées, le code correspondant est donc retiré.


Fichiers


Demandes liées

Lié à w.c.s. - Development #57623: sql: ne pas itérer ligne par ligne sur un SqlKlass.select(iterator=False)Rejeté05 octobre 2021

Actions

Révisions associées

Révision 5389956f (diff)
Ajouté par Benjamin Dauvergne il y a plus de 2 ans

sql: use batch iteration on ids instead of named cursors (#58013)

Named cursors imposed the use of isolated connections and were misused
resulting in reading using one SQL query by row (because of the use of
.fetchone() with cursors). This commit revert to the behaviour of one
connection per request and reading full SQL statement results at a time
without using cursors.

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

#3

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Lié à Development #57623: sql: ne pas itérer ligne par ligne sur un SqlKlass.select(iterator=False) ajouté
#5

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Statut changé de Solution proposée à En cours
#6

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

warnings pylint corrigés.

#7

Mis à jour par Frédéric Péters il y a plus de 2 ans

Le bout qui fait :

        else:  # for AnyFormData

ça me semble assez indiquer que cette part de code devrait aller dans la classe en question, et j'allais demander pourquoi, sauf qu'à relire la condition,

        if itersize and cls._has_id:

ça semble être assez différent de "for anything but AnyFormData".

Je me demande dans quelle mesure il y a moyen de rétrécir cette grosse condition partager davantage, sans avoir testé du tout, dans cette idée :

        if itersize and cls._has_id:
            sql_statement = '''SELECT id FROM %s''' % cls._table_name
        else:
            sql_statement = '''SELECT %s FROM %s''' % (select_fields, cls._table_name)
        where_clauses, parameters, func_clause = parse_clause(clause)
        if where_clauses:
            sql_statement += ' WHERE ' + ' AND '.join(where_clauses)

        sql_statement += cls.get_order_by_clause(order_by)

        if not func_clause:
            if limit:
                sql_statement += ' LIMIT %(limit)s'
                parameters['limit'] = limit
            if offset:
                sql_statement += ' OFFSET %(offset)s'
                parameters['offset'] = offset

            sql_id_statement = '''SELECT %s FROM %s WHERE id IN %%s''' % (
                select_fields,
                cls._table_name,
            )
            sql_id_statement += cls.get_order_by_clause(order_by)

        if itersize and cls._has_id:
            conn, cur = get_connection_and_cursor()
            with cur:
                cur.execute(sql_statement, parameters)
                conn.commit()
                ids = [row[0] for row in cur]
                while ids:
                    cur.execute(sql_id_statement, [tuple(ids[:itersize])])
                    conn.commit()
                    yield from retrieve()
                    ids = ids[itersize:]
        else:
            conn, cur = get_connection_and_cursor()
            with cur:
                cur.execute(sql_statement, parameters)
                conn.commit()
                yield from retrieve()
#8

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Voilà, la factorisation demandé, et j'ai changé les commentaires pour être plus explicite sur le pourquoi de la spécialisation qui ne sert actuellement qu'à AnyFormData.

#9

Mis à jour par Frédéric Péters il y a plus de 2 ans

  • Statut changé de Solution proposée à Résolu (à déployer)

Poussé et je tagguerai rapidement pour avoir ça déployé et suivre la conso.

commit 5389956f22fcb6e7afcc2c6ac8c862cf8eb356cb
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Wed Oct 20 10:49:44 2021 +0200

    sql: use batch iteration on ids instead of named cursors (#58013)

    Named cursors imposed the use of isolated connections and were misused
    resulting in reading using one SQL query by row (because of the use of
    .fetchone() with cursors). This commit revert to the behaviour of one
    connection per request and reading full SQL statement results at a time
    without using cursors.
#10

Mis à jour par Frédéric Péters il y a plus de 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF