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

Oracle Discussion :

[Oracle 10 g] Colonne auto-incrémentée


Sujet :

Oracle

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 386
    Points : 220
    Points
    220
    Par défaut [Oracle 10 g] Colonne auto-incrémentée
    Bonjour,

    Il se passe un truc que je ne m'explique pas.

    Quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into MaTable (NOM) values ('Pierre')
    la colonne ID présente dans cette table s'incrémente bien, dans le dernier insert l'ID=246.

    Par contre quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LAST_NUMBER FROM all_sequences WHERE sequence_name='SQ_TEST';
    il me retourne:361

    Bizarre , non ?

    Merci d'avance pour votre aide.

    A+

  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
    Quel est le cache size ?

    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
    26
    27
    28
    29
    CREATE SEQUENCE WMC_SEQ
      START WITH 0
      MAXVALUE 9999
      MINVALUE 0
      NOCYCLE
      CACHE 3;
     
    DECLARE
    	v_num NUMBER;
    BEGIN
    	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
    	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
    	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
    	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
    	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
    	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
    	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
    	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
    	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
    	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
    	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
    	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
    	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
    	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
    	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
    	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
    	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
    	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    last:0
    next:0
    last:3
    next:1
    last:3
    next:2
    last:3
    next:3
    last:6
    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
    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 ta demande est trop incomplète pour qu'on sache si ça vient de là.

    Quel est le trigger qui met à jour le champ ID.
    Qui d'autre utilise la séquence 'SQ_TEST' ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 386
    Points : 220
    Points
    220
    Par défaut
    Quel est le cache size ?
    Il était à 20. Je n'avais pas interprété comme çà ce paramètre.

    Encore merci.

    A+

  5. #5
    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
    Ben oui, mais 246 + 20 c'est toujours inférieur à 361
    Ou alors c'est pas 361 mais 261
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    386
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 386
    Points : 220
    Points
    220
    Par défaut
    la colonne ID présente dans cette table s'incrémente bien, dans le dernier insert l'ID=246.
    Il fallait lire 346.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Je me permets de remonter le sujet car je pense avoir un problème assez similaire à celui ci.

    En fait, j'ai aussi une séquence ou le cachesize est à 20 (j'ai récupérer des scripts de création que j'ai modifié et j'ai laissé cette valeur en faite...)

    Seulement, quand j'utilise une application qui se connecte à cette base, si j'utilise plusieurs fois la séquence, elle s'incrémente d'1 à chaque fois, mais parfois (je ne sais pas quand) il semblerait que la valeur "saute" et que la valeur selectionnée est la valeur + le cachesize (donc x1 ou x est un nombre quelconque).

    Je voudrais savoir pourquoi j'obtiens cela ? Et est-ce que ca peut poser des soucis ?

    Merci pour vos éclaircissements.

  8. #8
    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
    Les séquences sous Oracle certifient l'unicité et non la suite logique sans trou.

    Le cache : La suite des chiffres de la séquence est montée dans la mémoire, la séquence basée est modifiée avec valeur + cache_size

    Un flush du cache (volontaire ou pas) effacera les valeurs de la mémoire, Au prochain appel, Oracle refais une demande de cache_size chiffres (La valeur basée réaugmente de cache_size).


    Donc si tu fais appel à la séquence 1 fois, puis que la base travaille jusqu'à ce que l'espace dédié à la séquence soit requis, tu "sautes" des chiffres.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Voilà qui est plus clair, merci.

    Donc plus on met un cache_size faible, moins on saute de valeur mais je suppose que lorsqu'Oracle refait une demande de mise en cache, l'opération est plus longue c'est ca ?

    C'est pas dramatique si on a des valeurs qui sautent de toute façon ? Tant qu'elles sont bien uniques c'est l'essentiel ?

  10. #10
    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
    C'est exactement ça : Le "plus" couteux c'est de monter dans le cache les requetes.
    Ensuite ça dépend combien de fois la séquence est utilisée.. c'est pas la mort non plus si tu as un cache_size de faible.

    PS : par flush du cache volontaire j'entendais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER SYSTEM FLUSH SHARED_POOLED
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    OK, j'ai saisi

    Merci beaucoup.

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    C'est un simple problème de logique, oracle ne peut pas garantir une suite logique, car il fourni un numéro différent à chaque transactions, avant que celles ci soient commitées. Personne ne force apres l'utilisateur à valider la transaction, et en cas de rollback, tant pis ce numéro est "perdu". Il fourni aussi un numéro unique à chacun meme en cas d'accès multiple de plusieurs transactions à une même séquence.
    En imaginant qu'on exige d'oracle qu'il fournisse une suite propre, alors en retour il ne pourrait donner accès à la séquence qu'a une seule transaction à la fois. Une transaction longue lockerait alors la séquence pour tous les autres utilisateurs...

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

Discussions similaires

  1. Insérer colonne auto-incrémentée
    Par devroot dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/01/2010, 15h39
  2. [MySQL] Réinitialisation colonne auto-incrémentée
    Par Guttata dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/05/2009, 14h03
  3. Réponses: 15
    Dernier message: 10/02/2009, 10h01
  4. vider la colonne auto-incrémenté d'un champs vide
    Par phy4me dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 05/04/2008, 04h45
  5. Oracle 10g - Définir une colonne auto-incrémentée
    Par david71 dans le forum Oracle
    Réponses: 2
    Dernier message: 14/01/2008, 16h40

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