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

MS SQL Server Discussion :

Souci avec ID auto-incrémentés [2012]


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut Souci avec ID auto-incrémentés
    Salut à toute la communauté,
    J'ai fait une remarque pertinente que je veux soumettre à votre appréciation.
    J'ai une Base de données sql server 2012 avec des tables à ID _Auto incrémenté.
    Ma remarque est que l'ordre de l'ID n'est pas respecté. Par exemple, il quitte 5 pour 12501.
    Est ce un problème grave? Aura t' il des incident sur la performance de ma BDD?

    Merci de m'aider

  2. #2
    Membre averti
    Avatar de taibag
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 214
    Points : 357
    Points
    357
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Vous n'avez supprimé des lignes de votre table par hasard ?

    Jetez un coup d'oeil ici:
    http://blog.developpez.com/sqlpro/p6...vec_sql_server

    Merci.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    J'ai jamais supprimé des lignes.
    Aussi, je n'étais même pas à 10 enregistrement quand c'est aller à 12501

  4. #4
    Membre averti
    Avatar de taibag
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 214
    Points : 357
    Points
    357
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Lors de la création de vos tables vous n’avez pas définis les intervalles ?!!
    Signifie que l’autoincrément commençera à 1 et augmentera de 5 à chaque nouvelle ligne insérée.

    Cordialement.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Tout d'abord ce comportement est documenté, vous avez probablement redémarré sqlserver perdant les valeurs de la séquence générées en cache.
    IDENTITY (Property) (Transact-SQL)
    Consecutive values after server restart or other failures –SQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. This can result in gaps in the identity value upon insert. If gaps are not acceptable then the application should use a sequence generator with the NOCACHE option or use their own mechanism to generate key values.
    Regardez ce sujet pour un contournement si vous le jugez nécessaire :
    Failover or Restart Results in Reseed of Identity

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    je n'ai rien défini au niveau identity parce que je voudrais que l'autre soit de +1 chaque fois mais c'est bizarre. Je me suis dit que c'est la lenteur de mon PC, j'ai repris mon Systeme mais même choz alors que mon Sql server 2008 n'a jamais posé ce souci

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il faut déjà bien avoir à l'esprit que la propriété d'auto-incrémentation des colonnes est bien plus vieille que SQL Server 2012. Il serait donc très étonnant que Microsoft y ait touché. Par ailleurs plusieurs acteurs testent la dernière mouture du moteur avant que celui-ci ne soit commercialisé, et il est certain que ce serait quelque chose que les testeurs auraient noté très rapidement.

    Il est donc évident que vous avez soit supprimé des lignes, soit qu'une transaction d'insertion de lignes dans cette table a échoué. Dans le deuxième cas, la valeur courante du compteur ne retourne pas à sa valeur au début de la transaction.

    Enfin pour contrôler la configuration de la valeur du compteur d'auto-incrémentation, il existe quelques fonctions natives, que j'ai groupées dans la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT	IDENT_INCR(name) AS identity_increment
    	, IDENT_SEED(name) AS identity_seed
    	, IDENT_CURRENT(name) AS current_identity_value
    FROM	sys.tables
    WHERE	name = 'maTable'
    @++

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Il faut déjà bien avoir à l'esprit que la propriété d'auto-incrémentation des colonnes est bien plus vieille que SQL Server 2012. Il serait donc très étonnant que Microsoft y ait touché.
    Si on compare la doc 2012 et 2008 pour IDENTITY, on peut constater qu'elle a évolué.

    De plus dans le 2eme lien fourni ci-dessus on peut lire ça :
    Publié par Microsoft le 06/05/2013 à 15:53
    Hello all,

    I am the dev owning the identity feature.
    To boost the preformance for high end machines, we introduce preallocation for identity value in 2012.
    And this feature can be disabled by using TF 272 (then you will get the behaviour from 2008R2).

    The identity properties are stored separately in metadata.
    If a value is used in identity and increment is called, then the new seed value will be set.
    No operation, including Rollback, Failover, ..... can change the seed value except DBCC reseed.
    Failover applies for the table object, but no the identity object.
    So for failover, you can call checkpoint before manual failover, but you may see gap for unplanned cases.
    If gap is a concern, then I suggest you to use TF 272.

    For control manager shutdown, we have a fix for next verion (with another TF). This fix will take care of most control manager shutdown cases.

    Thanks,
    Bryan

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par skuatamad
    Si on compare la doc 2012 et 2008 pour IDENTITY, on peut constater qu'elle a évolué.
    Merci ! J'avais vu le premier lien mais pas le second

    Donc il faudrait savoir si eddyphan a réalisé un failover de cluster ou si une transaction a échoué. Ensuite même avec le nouveau comportement décrit par la documentation, je doute fort que le moteur mette 12500 valeurs en cache.

    @++

  10. #10
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Hello,

    pour info:
    à partir de SQL server 2012 tu peux utiliser un objet séquenceur comme valeur par défaut de ta colonne, ça te donne un peu plus de souplesse que l'IDENTITY.

    http://msdn.microsoft.com/fr-fr/library/ff878091.aspx

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Merci pour toute les réponses;
    M. Rudib : Je ne sais pas utilisé l'objet séquenceur de sql serveur comme valeur par défaut.

    Aussi quand j'exécute le scrip de M. elsuket :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT	IDENT_INCR(name) AS identity_increment
    	, IDENT_SEED(name) AS identity_seed
    	, IDENT_CURRENT(name) AS current_identity_value
    FROM	sys.TABLES
    WHERE	name = 'ARTICLE'
    j'obtien ceci null, null , null



    Je tiens à ajouter aussi que je n'ai jamais supprimé de ligne. Par exemple, sur la table des articles, j'ai exactement 21 ligne mais l'id est :

    1-5

    2027 - 2043


    Merci de m'aider svp

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Dans ma réponse précédente je vous précise que vous avez très probablement redémarré sqlserver :
    Dans le 2eme lien il y a des informations pour retrouver le fonctionnement de sqlserver 2008R2 :
    And this feature can be disabled by using TF 272 (then you will get the behaviour from 2008R2).
    Et également un mode opératoire pour réaliser le paramétrage :
    Publié par vishalishere le 18/06/2013 à 16:40
    for those who want to know how to add Trace flag 272 here are the steps

    1. Open "SQL Server Configuration Manager"
    2. Click "SQL Server Services" on the left pane
    3. Right-click on your SQL Server instance name on the right pane
    4. Click "Properties"
    5. Click "Startup Parameters"
    6. On the "specify a startup parameter" textbox type "-T272"
    7. Click "Add"
    8. Confirm the changes
    I am still evaluating if I should opt for tf 272 or use a sequence generator with NO CACHE setting (http://msdn.microsoft.com/en-us/library/ff878091.aspx) as this documentation says Trace flags may not be supported post SQL 2012

    Vishal Narayan Saxena
    Qu'est ce qui vous manque plus précisément ?

  13. #13
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par eddyphan
    j'obtien ceci null, null , null
    Donc c'est qu'aucune colonne de la table ARTICLE n'est auto-incrémentée

    @++

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Dans ma réponse précédente je vous précise que vous avez très probablement redémarré sqlserver :
    Dans le 2eme lien il y a des informations pour retrouver le fonctionnement de sqlserver 2008R2 :

    Et également un mode opératoire pour réaliser le paramétrage :

    Qu'est ce qui vous manque plus précisément ?

    Merci, j'ai appliqué les paramétrage. J'attends pour voir si ça a corrigé mon souci. Merci beaucoup pour l'apport

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Donc c'est qu'aucune colonne de la table ARTICLE n'est auto-incrémentée

    @++

    Merci,
    La colonne ID_AUTO est auto incrémentée

  16. #16
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par eddyphan Voir le message
    Merci,
    La colonne ID_AUTO est auto incrémentée
    hé bien visiblement votre serveur SQL n'en est pas informé !

    Qu'entendez vous par "auto-incrémenté" ? est-ce une colonne de type IDENTITY ?
    Où avez vous mis en place un mécanisme interne permettant d'attribuer automatiquement les identifiants ?

  17. #17
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 790
    Points
    6 790
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    le plus simple serait quand même d'avoir le create de la table pour savoir le seed et l'intervale.

    Cordialement,
    Lyche

  18. #18
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Lyche Voir le message
    Bonsoir,

    le plus simple serait quand même d'avoir le create de la table pour savoir le seed et l'intervale.

    Cordialement,
    Lyche
    Merci, voici le create de ma table :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    USE [P2014]
    GO
     
    /****** Object:  Table [MODELE].[ARTICLE]    Script Date: 05/12/2013 12:27:37 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [MODELE].[ARTICLE](
    	[ID_AUTO] [int] IDENTITY(1,1) NOT NULL,
    	[REFPRODUIT] [varchar](15) NOT NULL,
    	[CODEBARRE] [varchar](25) NOT NULL,
    	[LBLPRODUIT] [varchar](35) NOT NULL,
    	[DATECREATION] [datetime2](7) NULL,
    	[DATEMODIFICATION] [datetime2](7) NULL,
    	[TYPEPRIXFIXER] [varchar](18) NULL,
    	[IS_BLOQUE] [bit] NULL,
    	[ID_CATEG] [int] NULL,
    	[ConditionnementAchat] [varchar](15) NULL,
    	[ConditionnementVte] [varchar](15) NULL,
    	[GarantiMois] [int] NULL,
    	[QteColisage] [decimal](18, 2) NULL,
    	[Unite] [varchar](15) NULL,
     CONSTRAINT [PK_ARTICLE] PRIMARY KEY CLUSTERED 
    (
    	[ID_AUTO] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
     
    ALTER TABLE [MODELE].[ARTICLE]  WITH CHECK ADD  CONSTRAINT [FK_ARTICLE_FK_ARTICL_CATEGORI] FOREIGN KEY([ID_CATEG])
    REFERENCES [MODELE].[FAMILLEPRODUIT] ([ID_AUTO])
    GO
     
    ALTER TABLE [MODELE].[ARTICLE] CHECK CONSTRAINT [FK_ARTICLE_FK_ARTICL_CATEGORI]
    GO

  19. #19
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    A un moment donné vous avez du avoir un réajustement des valeurs, par exemple avec un CHECKIDENT avec RESEED.

    A +

  20. #20
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    A un moment donné vous avez du avoir un réajustement des valeurs, par exemple avec un CHECKIDENT avec RESEED.

    A +
    OK, j ne comprends pas, je n'ai rien fait, c'est arriver comme ça. Mais est ce qu'une telle chose peut poser un souci à la performance de ma base dans le future?

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

Discussions similaires

  1. Problème avec l'auto incrémentation
    Par k3nz0 dans le forum Administration
    Réponses: 3
    Dernier message: 01/07/2011, 15h43
  2. [MySQL] valeur id ne changeant pas avec un auto incrément
    Par zabdaniel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/03/2008, 17h00
  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. Champ auto incrémenté avec MyBase
    Par selmak7 dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/04/2007, 10h46
  5. Compactage de tables Paradox avec auto-incrément
    Par Unusual_FL dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/09/2004, 15h05

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