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 Oracle Discussion :

Question sur l'auto-incrémentation


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut Question sur l'auto-incrémentation
    Bonjour,

    J'ai une base où pour la quasi-totalité de mes tables, j'ai mis en place le système d'auto-incrémentation classique avec la séquence et le trigger.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE SEQUENCE seq_users START WITH 1 INCREMENT BY 1;
     
    CREATE TRIGGER trg_users 
    BEFORE INSERT ON USERS 
    FOR EACH ROW
    BEGIN
    select seq_users.nextval into :new.id from DUAL;
    END;
    /
    La question que je me pose, c'est pourquoi les IDs que j'ai en base actuellement sont si grand par rapport à mon nombre d'entrées? A titre d'exemple, le dernier ID généré doit être 1600 et des broquilles alors que j'ai pas plus de 400 entrées en totalité dans la base. Ça donne l'impression que toutes les tables partagent une séquence unique (ce qui n'est évidemment pas le cas).

    Je veux bien que ça incrémente l'id même quand une requête d'INSERT foire, mais bon, c'est quand même assez rare.

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je ne comprends pas ta phrase :
    Ça donne l'impression que toutes les tables partagent une séquence unique (ce qui n'est évidemment pas le cas).
    Tu as une séquence par table ?

    Les séquences permettent d'avoir la certitude de l'unicité, par contre tu peux avoir des trous.
    Les valeurs des séquences sont mises en cache (par défaut, c'est par 20 je crois), donc il suffit que le cache soit purgé [arrêt de base / flush shared pool, etc..], et tu "perds" les n° non utilisés.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par M4veR1K Voir le message
    Je veux bien que ça incrémente l'id même quand une requête d'INSERT foire, mais bon, c'est quand même assez rare.
    Il suffit que la séquence soit appelée pour que l'incrément soit fait. Par exemple, une application peut appeler la séquence pour fixer un identifiant à un nouvel enregistrement (mettons, une commande en ligne).
    Mais finalement, l'utilisateur ne valide pas, il y a un logout, etc.
    Résultat, un n° non utilisé.

    => Il faut bien voir que ça n'a pas d'importance. Ce qui est important, c'est l'insertion (presque) dans l'ordre, la clé de petite taille, et l'unicité.

  4. #4
    Membre confirmé
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Points : 542
    Points
    542
    Par défaut
    Comme l'a dit McM il y a par défaut un cache de 20, du coup si tu souhaites supprimer ce cache il faut préciser à la création de la séquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE SEQUENCE seq_users START WITH 1 INCREMENT BY 1 NOCACHE;
    Cependant la mise en cache peut permettre d'obtenir des gains en performance, à toi de voir

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Merci pour vos réponses. Je comprends mieux désormais.

    J'ai fait pas mal d'appli avec l'auto-incrémentation (quand j'étais étudiant, et maintenant en entreprise) et je m'étais toujours demandé: "mais pourquoi des fois il y a de gros trous au niveau des identifiants ?".

    Effectivement, comme dit Rei Ichido, ça n'a peu d'importance, à partir du moment où j'ai bien un numéro unique pour chaque entrée.

    Par contre, ça réduit la durée où il va falloir remplacer les int par des long pour es identifiants dans les modèles de données ^^

    Merci pour l'astuce du NOCACHE Bibeleuh. Néanmoins, si ne pas le mettre permet un gain de performance, alors autant de pas l'utiliser

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par M4veR1K Voir le message
    Par contre, ça réduit la durée où il va falloir remplacer les int par des long pour es identifiants dans les modèles de données ^^
    C'est un faux problème.
    Même en prenant un NUMBER(15) sachant qu'Oracle va naturellement jusqu'à un NUMBER(38), avec 100.000 insertions par seconde il faut un peu plus de trois siècles pour arriver à la limite de la colonne.
    Alors même s'il y a 80% de trous dans la séquence, ça laisse encore 60 ans de répit, et à priori vous n'avez pas vraiment 100.000 insertions par seconde.

    Citation Envoyé par M4veR1K Voir le message
    Merci pour l'astuce du NOCACHE Bibeleuh. Néanmoins, si ne pas le mettre permet un gain de performance, alors autant de pas l'utiliser
    Le gain a lieu lors d'insertions massives de données.
    Si c'est dans votre application et que vous insérez généralement les lignes une à une, vous ne constaterez probablement pas de différence.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait, pour l'optimisation du cache, une séquence très fréquemment utilisée, il faut monter la valeur du cache.
    Imagine un traitement qui crée 1000 lignes / seconde pendant quelques minutes..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE SEQUENCE seq_users START WITH 1 INCREMENT BY 1 CACHE 200;
    Pour savoir la valeur optimale à mettre, c'est au feeling.
    Quand au gain de perf, je ne pense pas qu'il se voie sur un seul traitement, mais la base s'en sentira mieux.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Waldar
    C'est un faux problème.
    Je parlais d'un mapping avec un langage de programmation qui utilise des int (java). Mais je viens de me renseigner à l'instant, et il y a de la marge de ce côté ici aussi.

    Citation Envoyé par Waldar
    Si c'est dans votre application et que vous insérez généralement les lignes une à une, vous ne constaterez probablement pas de différence.
    Ha, dans ce cas la, je suis parti pour cette solution.

    Merci McM pour ces astuces, c'est bon à savoir!

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par McM Voir le message
    En fait, pour l'optimisation du cache, une séquence très fréquemment utilisée, il faut monter la valeur du cache.
    De mon expérience, la valeur par défaut de 20 pour le cache est très bonne, et seuls des tests artificiels (boucle qui ne fait que des incrémentations de séquence, sans rien d'autre d'utile) bénéficient d'un cache supérieur. Et encore, au-delà de 100, je ne voyais même pas d'amélioration.

    Par contre ça serait intéressant que vous précisiez dans quel contexte de traitement réel (nombre de sessions simultanées, insertions par seconde, etc) vous avez pu voir une vraie amélioration en augmentant le cache.
    Et le fin du fin, ça serait une mesure de l'amélioration obtenue.

    Pour info, il existe dans V$SESS_TIME_MODEL une statistique "sequence load elapsed time" qui indique le temps passé à obtenir le NEXTVAL des séquences qui n'ont pas de cache, ou le temps passé à alimenter le cache pour les séquences qui en ont.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. auto-incrément Mysql sur Access
    Par maxireus dans le forum Access
    Réponses: 8
    Dernier message: 14/03/2008, 00h26
  2. Réponses: 11
    Dernier message: 23/11/2007, 09h38
  3. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24
  4. auto-incrément Mysql sur Access
    Par maxireus dans le forum Access
    Réponses: 4
    Dernier message: 07/03/2006, 00h35
  5. auto-incrément Mysql sur Access
    Par maxireus dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 06/03/2006, 21h20

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