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

Adaptive Server Enterprise Sybase Discussion :

champ auto-incrémenté bizarre


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 24
    Points
    24
    Par défaut champ auto-incrémenté bizarre
    Salut à tous.

    J'ai une table de ma base de donnée qui possède un champ auto-incrémenté.
    Lorsque j'insère des valeurs, tous se passe bien. Mais à un moment, pour une insertion comme les autres, le champ auto-incrémenté passe de valeurs "normales "(1,2,3,4,5...) à une valeurs bizarre (qqc comme : 500000000002). Et il continue à s'incrémenter à partir de cette valeur ensuite.
    Non pas que cela gêne le fonctionnement de mon application, mais je trouve ce fonctionnement bizarre et j'aimerai le comprendre.
    Si quelqu'un pouvait me l'expliquer il serait le bienvenue.
    Merci d'avance

  2. #2
    Membre habitué
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Points : 168
    Points
    168
    Par défaut
    Pour éviter ce saut, il te faut modifier la propriété identity_gap de ta table.
    Plus de détails ici:
    http://sypron.nl/idgaps.html

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    La valeur du champ identity le plus élevé est enregistré sur la page de guarde de la table. Pour éviter d'écrire cette page chaque fois qu'il y a un insert ASE pré-alloue un range de valeur.

    Quand le serveur est arrêté normalement ASE écrit la valeur la plus élevée effectivement utilisée, mais quand ASE est arrêté brutalement (shutdown with nowait) ASE ne sait pas quelle est la valeut la plus élevée utilisée, et de ce fait repart à partir du bloc suivant.

    Par défaut la préallocation se fait sur 0.5% de la taille possible du champ (p.ex. si c'est un numeric(10) l'allocation est de 5000000).

    Tout ceci est configurable. Premièrement via l'option 'identity burning set factor' (sp_configure). Deuxièment, pour ASE 12.x on peut spécifier un gap maximum lors de la création de la table (with identity_gap = xxx), ou via sp_chgattribute.

    Plus d'info sur ces problèmes à http://www.sypron.nl/id_gaps.html

    Michael

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    A relever cependant que l'identity doit être garant de l'unicité et non de la séquence. Le comportement est donc bizarre, mais tout à fait correct...

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Absolument.

    Il faut cependant faire attention - il y a une tendance à déclarer les colonnes identity comme numeric(18,0) voir numeric(36,0). Si ces colonnes sont ensuites utilisées dans des applications (VB, C, Java, etc) et que les valeurs sont mappées sur des variables applicatives de type "int" (soit 32 bit) alors on risque d'avoir un overflow.

    Le numeric() le plus grand qui tient dans une variable 32 bit est numeric(9,0).

    Michael

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 61
    Points
    61
    Par défaut identity burning set factor"
    Bonjour a tous,

    tout d'abord je tiens a vous dire
    combien la compétence des personnes qui
    animent ce forum me surprend toujours

    Dans le cadre d'une action corrective d'identity
    qui font des sauts importants.

    est ce quelqu'un connait
    sp_configure "identity burning set factor", 10
    (ou sp_configure "identity burning set factor", 1)
    a quoi correspond cette commande ?

    est elle identique a sp_chgattribute 'MA_TABLE', 'identity_gap', 1 ?

    ASE 12.5

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Non, ce n'est pas identique.

    Le "identity burn set factor" est un ratio - la valeur par défaut (5000) implique que l'on va pré-allouer un range qui correspond à 5000 * 10^-7 * 10^(precision de la colonne identity). Donc pour 5000 on va préallouer 5000000 valeurs.

    Le "identity_gap" est au contraire une valeur absolue - 1, 10, 100, etc. et c'est le gap maximal qui peut se produire en cas d'arrêt brutal du serveur.

    A noter que les gaps se produisent parce que la valeur de l'identity la plus élevée est enregistrée sur la page de garde (OAM page) de la table, et que plus le gap possible est petit, plus cette page doit être mise à jour souvent. Si c'est une table avec un grand nombre d'insert par minute il faut mettre un gap relativement important pour ne pas compromettre la performance des inserts.

    Michael

Discussions similaires

  1. Connaître la valeur d'un champ auto incrémenté
    Par soltani1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/05/2006, 14h55
  2. [EJB2.1 Entity] [Débutant] Champs auto-incrémenté (identity)et EJB
    Par Houbbba dans le forum Java EE
    Réponses: 9
    Dernier message: 04/04/2006, 19h15
  3. champ auto incrémenté
    Par Kerod dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/09/2005, 17h29
  4. [BCB5][FB 1.5]IBDataSet et champ Auto-incrémenté
    Par Sitting Bull dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 21/07/2004, 15h37
  5. [JDO]Hibernate : Mapping d'un champ auto-incrémenté
    Par brice.antoine dans le forum Hibernate
    Réponses: 4
    Dernier message: 02/04/2004, 10h36

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