IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

optimiser une recherche


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut optimiser une recherche
    Bonjour à tous,

    J'ai une application pour supérette, et à chaque nouvelle vente une incrémentation du numéro de ticket est effectuée de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select max(ticket) from vente
    la méthode marche très bien jusqu'au la table arrive à 300 000 lignes là ça commence à devenir lent et à 500 000 ligne ça devient encore plus lent. Je ne sais pas s'il ya une méthode plus efficace d'incrémentation

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Oui d'une il faut utiliser un générateur qui est le seul moyen en multiposte d'avoir un numéro unique.
    Mais si vous êtes en monoposte et préférez utiliser le max(ticket) (qui est une mauvaise pratique) il faut absolument que ticket soit indexé (soit c'est la clé primaire soit il y a un index unique).
    Sinon max(ticket) oblige firebird à balayer tous les enregistrements de la table pour trouver le plus grand....

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Un autre SQL pourrait faire l'affaire , toujours si TICKET est un index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT FIRST 1 TICKET FROM VENTE ORDER BY TICKET DESC 
    --ou 
    SELECT TICKET FROM VENTE ORDER BY TICKET DESC ROWS 1
    mais la SEQUENCE (ou GENERATEUR), traité de plus dans un TRIGGER est vraiment la meilleure solution
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Le probléme du génerateur c'est qu'il incrémente la valeur de ticket sans prendre en considération si le ticket est validé ou non ou même supprimé, et comme ça il ya plus de concordance entre le numéro ticket du génerateur et le numéro ticket phisique.Par contre la solution proposé par @sergio peut faire l'affaire, il faut voir maintenant est-ce qu'elle prend plus de temps que la méthôde max

  5. #5
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Bonjour,

    Le probléme du génerateur c'est qu'il incrémente la valeur de ticket sans prendre en considération si le ticket est validé ou non ou même supprimé, et comme ça il ya plus de concordance entre le numéro ticket du génerateur et le numéro ticket phisique.Par contre la solution proposé par @sergio peut faire l'affaire, il faut voir maintenant est-ce qu'elle prend plus de temps que la méthôde max
    La méthode max ou un order by seront équivalentes et nécessitent toutes les deux la création d'un index.

    Le générateur va créé des trous dans le cas d'un ticket non validé. Mais ca peut faire l'objet d'une gestion séparée.
    Vous êtes forcément en monoposte sinon vous auriez eut des problemes avec max().

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Vous êtes forcément en monoposte sinon vous auriez eut des problemes avec max().
    Non, j'utilise max aussi en réseau et ça marche très bien a part la lenteur

  7. #7
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Non, j'utilise max aussi en réseau et ça marche très bien a part la lenteur
    Oui ça fonctionne jusqu'à ce que ça ne fonctionne plus.

    C'est comme traverser une route sans regarder s'il y a des voitures. Sur une route peu passante vous traverserez sans problème (même s'il y a un risque). La plupart du temps vous traverserez ça ne veut pas dire que c'est une bonne pratique...

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut à tous.

    C'est le cas typique de la gestion des paramètres d'une application.
    Pour ce faire, j'utiliserai une table de nom 'parametres' dédiée à ce genre de problème.
    Sachant que chaque paramètres est identifié par le rang dans la table.
    Ainsi id=5 signifie, par convention, que c'est le dernier numéro du ticket.

    Dans un premier temps, je lis la table afin de récupérer la dernière valeur du ticket. Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select val from parametres where id = 5;
    Je fais ensuite un : num = ticket + 1.

    Puis je mets à jour la table 'parametres', en venant écraser 'ticket' par la valeur de 'num'. Genre ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update parametres set val = :num where id=5;
    Voilà pour le principe et cela est très performant, car tu lis qu'un seul enregistrement.

    Je suis d'accord avec Barbibulle, il est nécessaire dans les solutions proposées, d'avoir un index.

    Hormis ce que je propose, il n'y a pas de solutions performantes pour ce genre de problème.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    @Arthemus24

    Ta solution comporte les mêmes risque de collision.

    Si deux caisses demandent un numéro de Ticket simultanément elles risquent d'avoir le même numéro.

    La réponse de Firebird à ce genre de problème et également pour les identifiants uniques s'appel un Générateur.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    C'est pas être prétentieux, mais depuis que je suis sur ce forum j'expose toujours des cas existantes(pratiqué), ce problème je l'ai eu chez l'un de mes clients qui à une grande surface avec 15 caisses(poste client) et pour remédier à tous les problème de confrontation de plusieurs poste sur le même ticket, je rafraichi automatiquement la base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bd1.connected:=false;
    bd1.connected:=true;
    ///en suite j'execute la commande max

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    Et après ton client se plaint de la lenteur !

    le générateur, la norme préfère que l'on dise la séquence, n'a pas obligatoirement a être le numéro du n° du ticket !

    Citation Envoyé par Barbibulle
    La méthode max ou un order by seront équivalentes et nécessitent toutes les deux la création d'un index.
    j'avais bien indiqué toujours si TICKET est un index

    ce trigger par exemple utilisera la séquence pour avoir un numéro unique et récupérera le dernier numéro de ticket+1 à la manière d'Artemus24
    Attention : écrit sans filet , SELECT INTO non testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    CREATE GENERATOR GEN_VENTE_ID;
    CREATE TABLE VENTES (NUMEROVENTE DECIMAL(18,0) NOT NULL,
                                  NUMEROTICKET DECIMAL(18,0) NOT NULL,
                                  ....
                                  );
    ALTER TABLE VENTES ADD CONSTRAINT  PK_VENTES PRIMARY KEY(NUMEROVENTE); -- index
    CREATE UNIQUE INDEX IDX_TICKET ON VENTES (NUMEROTICKET);                                    -- index 
     
    SET TERM ^ ;
    CREATE TRIGGER TICKET_BI FOR VENTES ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.NUMEROVENTE IS NULL) THEN
       BEGIN 
         SELECT COALESCE(NUMEROTICKET,0) +1  FROM VENTES WHERE NUMEROVENTE=GEN_ID(GEN_VENTE_ID, 0) INTO NEW.NUMEROTICKET;
         NEW.NUMEROVENTE = GEN_ID(GEN_VENTE_ID, 1);
       END
    END^
    SET TERM ; ^
    pour renforcer encore la vitesse d'exécution du SELECT un index en ordre descendant et forcer un PLAN pourrait même être envisageable

    [EDIT] testé mais pas en multi postes, cette solution présente l'avantage d'être mise en place dans une base existante assez facilement
    pour mon test mono poste, base vide, j'ai fait quelques inserts de la manière suivante :
    INSERT INTO VENTES VALUES (NULL,5); -- répétés 7 fois
    résultat :
    1 5
    2 6
    3 7
    4 8
    5 9
    6 10
    7 11
    Constation : à quelque chose erreur est bonne, il n'était pas prévu que je mette quoique ce soit dans le INSERT mais n'ayant pas d'autres champs dans la table VENTE et trouvant un INSERT INTO VENTES VALUES (NULL,NULL) un peu nul, c'est le moins que l'on puisse dire, je voulais voir ce qui pouvait se passer dans ce cas ! je m'attendais à ce que les valeurs des numéros de tickets soit de 1 à 7 mais non mon SELECT est à revoir le COALESCE ne fonctionne pas ! (pourquoi d'ailleurs ?)

    je m'en sors en rajoutant IF (NEW.NUMEROTICKET IS NULL) THEN NEW.NUMEROTICKET=1; après le SELECT
    bien sur j'aurais simplement pu faire INSERT INTO VENTES VALUES(NULL,1) mais c'est moins drôle
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    Dans un premier temps, je lis la table afin de récupérer la dernière valeur du ticket. Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select val from parametres where id = 5;
    Je fais ensuite un : num = ticket + 1.

    Puis je mets à jour la table 'parametres', en venant écraser 'ticket' par la valeur de 'num'. Genre ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update parametres set val = :num where id=5;
    Ça, c'est ce que je faisais il y a 15-20 ans avec des tables Paradox. Mais il ne faut pas oublier dans ce cas de "poser un verrou" sur la table parametres juste pour le temps de l'opération, sans cela il y a risque de collision avec un autre utilisateur. Jamais essayé, mais il me semble qu'il est possible de le faire avec Firebird en paramétrant une transaction spécialement pour ça.
    Les trous dans les numéros de commande! Ça a toujours été l'objet de querelles avec les comptables. Je n'ai jamais su si c'était une obligation légale ou un simple moyen de contrôle...

    André

  13. #13
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par alanglet Voir le message
    Les trous dans les numéros de commande! Ça a toujours été l'objet de querelles avec les comptables. Je n'ai jamais su si c'était une obligation légale ou un simple moyen de contrôle...
    Le droit à l'erreur ça existe, vous tiendriez un facturier dans un cahier à la main. Même en faisant très attention, à un moment donné il y a aura une erreur, ce n'est pas pour autant qu'il faut masquer la ligne, ou refaire le cahier...

    Une facture ou ticket numéroté qu'on "annule" il suffit d'avoir prévu une colonne "annulation" ou bien gérer une table des numéros annulés. Le destinataire de la facture/ticket c'est tout simplement la poubelle.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par alanglet Voir le message
    Les trous dans les numéros de commande! Ça a toujours été l'objet de querelles avec les comptables. Je n'ai jamais su si c'était une obligation légale ou un simple moyen de contrôle...
    Dans les numéros de commande là je pense que les comptables sont pointilleux et confondent avec les numéros de factures pour ces derniers cela semble être une obligation légale du moins je le pense : les contrôles fiscaux sont très pointilleux à ce sujet
    il m'a même été demandé de mettre avoir et facture dans la même suite .
    par exemple 2015-1 facture
    2015-2 facture
    A2015-3 Avoir
    2015-4 facture
    etc...
    alors qu'avant je numérotais les avoirs et les factures dans des séquences différentes
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Ah! les comptables qui font tous les jours des sommes à la main pour vérifier que l'informatique ne s'est pas trompée...
    Pour en revenir au problème du numéro unique sans trou dans la suite, la solution de la table "parametres" peut être utilisable en bloquant les accès pendant la lecture et la mise à jour. Avec Firebird ceci devrait pouvoir être fait dans une transaction particulière ayant les options:
    LockRead
    LockWrite
    Wait pour attendre que la table soit libérée si un autre utilisateur fait la même manip (très courte).
    Si quelqu'un a essayé...

    André

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par alanglet Voir le message
    Ah! les comptables qui font tous les jours des sommes à la main pour vérifier que l'informatique ne s'est pas trompée...
    et qui nous font tout un plat en cas d'écart de 1 cent !
    mais n'oublions pas dans comptable il y a table
    Avec Firebird ceci devrait pouvoir être fait dans une transaction particulière ayant les options:
    LockRead
    LockWrite
    Wait pour attendre que la table soit libérée si un autre utilisateur fait la même manip (très courte).
    Si quelqu'un a essayé...
    jamais essayé, la technique que j'ai proposé étant un trigger donc une transaction je pense qu'elle sera fiable. Cependant je n'ai pas d'environnement pour faire des tests poussés (deux postes dont l'un comme serveur c'est peu) et il me faudrait faire un programme simulant des insertions (bah c'est faisable mais bon déjà pas mal que je propose une solution non ?)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonsoir,
    Citation Envoyé par SergioMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    CREATE GENERATOR GEN_VENTE_ID;
    CREATE TABLE VENTES (NUMEROVENTE DECIMAL(18,0) NOT NULL,
                                  NUMEROTICKET DECIMAL(18,0) NOT NULL,
                                  ....
                                  );
    ALTER TABLE VENTES ADD CONSTRAINT  PK_VENTES PRIMARY KEY(NUMEROVENTE); -- index
    CREATE INDEX IDX_TICKET ON VENTES (NUMEROTICKET);                                    -- index 
     
    SET TERM ^ ;
    CREATE TRIGGER TICKET_BI FOR VENTES ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.NUMEROVENTE IS NULL) THEN
       BEGIN 
         SELECT COALESCE(NUMEROTICKET,0) +1  FROM VENTES WHERE NUMEROVENTE=GEN_ID(GEN_VENTE_ID, 0) INTO NEW.NUMEROTICKET;
         NEW.NUMEROVENTE = GEN_ID(GEN_VENTE_ID, 1);
       END
    END^
    SET TERM ; ^
    Vous allez dire que je pinaille, mais cette méthode ne me semble pas exempte non plus du risque de collision. Si 2 utilisateurs insèrent quasi-simultanément un enregistrement dans la table VENTES, peut-il être garanti que le premier aura exécuté la ligne 19 (celle qui incrémente le générateur) avant que le second exécute aussi la ligne 18? On aurait alors 2 fois le même NUMEROTICKET.
    De plus, il faudrait que les transactions permettent de voir au plus vite les modifications exécutées, sinon la ligne 18 pourrait retourner NUMEROTICKET=null si la ligne avec le dernier NUMEROVENTE=GEN_ID(GEN_VENTE_ID, 0) n'est pas encore visible.

    André

  18. #18
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut à tous.

    Citation Envoyé par Barbibulle
    Ta solution comporte les mêmes risque de collision.

    Si deux caisses demandent un numéro de Ticket simultanément elles risquent d'avoir le même numéro.
    Je suis d'accord avec toi, mais c'est un autre problème. Et c'est pourquoi, on a inventé le transactionnel !
    Et rien ne t'empêche aussi de verrouiller ta table lorsque tu veux faire une opération dessus, pour être le seul à intervenir.
    Et je n'ai jamais dit que c'était ce qu'il fallait faire. J'expose juste une idée qui me semble logique.

    Mais voilà, est-ce que chekkal sait utiliser le mode transactionnel avec FireBird ?

    La question de chekkal est comment accéder le plus rapidement à la dernière valeur d'un incrément.
    Sa solution est de passer par un 'select max(ticket) from vente'.

    Sous MySql, on utilise un 'auto_increment' pour constituer la 'primary key' (la colonne 'id') lorsque l'on veut attribuer un numéro séquentiel croissant. Exemple sous MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    select * from test3
    --------------
     
    +----+-----+-------+
    | id | num | val   |
    +----+-----+-------+
    |  1 |  15 | bleu  |
    |  2 |  21 | rouge |
    |  3 |   3 | vert  |
    |  4 |  17 | bleu  |
    |  5 |  75 | bleu  |
    |  6 |   9 | bleu  |
    |  7 |  12 | rouge |
    +----+-----+-------+
    --------------
    SELECT AUTO_INCREMENT as last_id
    FROM INFORMATION_SCHEMA.TABLES
    WHERE table_name = 'test3'
    --------------
     
    +---------+
    | last_id |
    +---------+
    |       8 |
    +---------+
    La récupération de la dernière valeur de cet auto incrément est instantanée. Est-ce que cela existe sous FireBird ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  19. #19
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    La récupération de la dernière valeur de cet auto incrément est instantanée. Est-ce que cela existe sous FireBird ?
    Oui c'est ce que je proposais : Les générateurs.

    Les générateurs sont hors transaction.

  20. #20
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 049
    Points
    19 049
    Par défaut
    Salut à tous.

    Citation Envoyé par SergioMaster
    ce trigger par exemple utilisera la séquence pour avoir un numéro unique et récupérera le dernier numéro de ticket+1 à la manière d'Artemus24
    Ce trigger, c'est pour automatiser la recherche du dernier numéro de ticket et de faire un 'ticket <-- ticket +1'.
    Mais pourquoi insérer une nouvelle ligne à chaque fois ?

    Citation Envoyé par alanglet
    Ça, c'est ce que je faisais il y a 15-20 ans avec des tables Paradox.
    Je te rassure, moi aussi mais sous gros système ibm. Je trouve cela un lourdingue, mais bon, l'idée est bonne, mais pas la façon de l'appliquer.

    Citation Envoyé par alanglet
    Mais il ne faut pas oublier dans ce cas de "poser un verrou" sur la table parametres juste pour le temps de l'opération, sans cela il y a risque de collision avec un autre utilisateur.
    Oui, mais ça, c'est un autre problème.

    Citation Envoyé par alanglet
    Ah! les comptables qui font tous les jours des sommes à la main pour vérifier que l'informatique ne s'est pas trompée...
    Excellente ! Mais tu n'es pas très loin de la vérité.

    Citation Envoyé par SergioMaster
    et qui nous font tout un plat en cas d'écart de 1 cent !
    Mais si le trou est de 1 million, c'est tout à fait normal.

    @ Barbibulle : Merci pour l'info. Et comme tu le sais, je ne suis pas encore opérationnel avec FireBird. As-tu un exemple à donner ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [index] performance sur une recherche descendante
    Par jean-jacques varvenne dans le forum Oracle
    Réponses: 16
    Dernier message: 15/01/2005, 10h22
  2. Optimisation d'une recherche et mise à jour
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/01/2005, 18h38
  3. Réponses: 8
    Dernier message: 10/09/2004, 17h30
  4. [VB.NET] Quel objet tableau pour une recherche indexée ???
    Par Kitano dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/09/2004, 09h38
  5. Enlever la surbrillance lors d'une recherche avec vi
    Par sekiryou dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 04/03/2004, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo