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

Développement SQL Server Discussion :

Warning! The maximum key length is 900 bytes


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut Warning! The maximum key length is 900 bytes
    bonjour,

    tout est dans le titre, message reçu après création d'un index "banal" sur 2 varchar(50) sur table contenant 20000 lignes seulement

    message complet:

    Warning! The maximum key length is 900 bytes. The index 'xxxxx' has maximum length of 1020 bytes. For some combination of large values, the insert/update operation will fail

    merci

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    un index de seulement 2 colonnes varchar(50) ne peut pas générer ce genre d'erreur. Il doit y avoir d'autres colonnes ou des colonnes incluses. Peux tu nous poster le script de création de l'index stp ?

  3. #3
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Donne nous la définition complète de ton index et la version de ton instance SQL Server.

    ++

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    voila,
    c'est le seul index, pas de PK

    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX IX_COMMISSION_LGB_SUB ON COMMISSION (COM_LGB_NAME,COM_SUB_NAME);
    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
    CREATE TABLE [dbo].[COMMISSION](
    	[COM_ID] [bigint] NOT NULL,
    	[COM_AMT_LOCAL] [numeric](18, 6) NULL,
    	[COM_CUR_NAME] [nvarchar](50) NULL,
    	[COM_AMT_EURO] [numeric](18, 6) NULL,
    	[COM_BILLING_YEAR_DAT] [int] NULL,
    	[COM_BILLING_MONTH_NUM_DAT] [int] NULL,
    	[COM_LGB_NAME] [nvarchar](255) NULL,
    	[COM_LOG_NAME] [nvarchar](255) NULL,
    	[COM_SUB_NAME] [nvarchar](255) NULL,
    	[COM_BILACC_NAME] [nvarchar](255) NULL,
    	[COM_IS_EVENT] [smallint] NULL,
    	[COM_IS_ONE_RATE] [smallint] NULL,
    	[COM_PRO_NAME] [nvarchar](255) NULL,
    	[COM_STATUS] [nvarchar](255) NULL,
    	[COM_SAL_NAME] [nvarchar](255) NULL,
    	[COM_LOGO_MONTH_NEW] [int] NULL,
    	[COM_DURATION_BILLED] [numeric](18, 6) NULL,
    	[COM_BILLING_YEAR_MONTH] [int] NULL,
    	[COM_IS_BILLED] [int] NULL,
    	[COM_SALES_GROUP_NAME] [nvarchar](255) NULL,
    	[COM_LOGO_YEAR_NEW] [int] NULL,
    	[COM_BILACC_REF] [varchar](255) NULL,
    	[COM_CUR_ISONAME] [char](4) NULL,
    	[COM_LOGO_YEAR_MONTH_NEW] [int] NULL,
    	[COM_WIN_BACK] [int] NULL
    )

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    je joins aussi le message d'erreur complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning! The maximum key length is 900 bytes. The index 'IX_COMMISSION_LGB_SUB' has maximum length of 1020 bytes. For some combination of large values, the insert/update operation will fail.

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Ces 2 colonnes sont des nvarchar, donc si on prend la définition du nvarchar on voit que la taille d'une colonne nvarchar(255) = 255 octets * 2 + 2. Soit 1024 octets pour les 2 colonnes. Tu dépasses donc bien les 900.
    Es tu obligé d'avoir du nvarchar ? Es tu obligé d'avoir une taille de 255 ?

    Edit : le lien msdn http://msdn.microsoft.com/fr-fr/library/ms186939.aspx

  7. #7
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Tiens d'ailleurs, dans mon calcul j'arrive à 1024 et dans le message d'erreur 1020 octets. Quel est le bon chiffre ?

  8. #8
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Si l'addition de la taille de toutes les colonnes de clés fixes et de la taille maximale de toutes les colonnes de clés variables dépasse 900, mais si l'addition de la taille de toutes les colonnes de clés fixes et des tailles minimales des colonnes de clés variables est inférieure à 900, l'instruction CREATE INDEX aboutit avec un message d'avertissement indiquant qu'une instruction INSERT ou UPDATE ultérieure pourra échouer si elle spécifie des valeurs générant une valeur de clé supérieure à 900 octets. L'instruction CREATE INDEX échoue si les lignes de données existantes de la table ont des valeurs qui génèrent une clé supérieure à 900 octets. Toute instruction INSERT ou UPDATE ultérieure qui spécifie des valeurs de données générant une valeur de clé supérieure à 900 octets échouera.

    Source : http://msdn.microsoft.com/fr-fr/library/ms191241(v=sql.90).aspx
    Etienne ZINZINDOHOUE
    Billets-Articles

  9. #9
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Tiens d'ailleurs, dans mon calcul j'arrive à 1024 et dans le message d'erreur 1020 octets. Quel est le bon chiffre ?
    Le calcul est fait de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
     SUM(max_length)AS TotalIndexKeySize
    FROM sys.columns
    WHERE name IN (N'COM_LGB_NAME', N'AddressLine2', N'COM_SUB_NAME')
    AND object_id = OBJECT_ID(N'COMMISSION');
    = 1020 octects

    ++

  10. #10
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Pour le MSDN dit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La taille de stockage, en octets, est le double du nombre de la longueur réelle des données entrée plus 2 octets.
    soit 1024 si j'ai tout compris ?

  11. #11
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    En fait ici on ne parle que de la longueur des données. Les 2 octets pour chaque colonne supplémentaires sont 2 octets pour la gestion du type variable.

    Si on fait le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT COMMISSION ([COM_ID], COM_LGB_NAME,COM_SUB_NAME) VALUES (1, REPLICATE('T',225), REPLICATE('T', 225));
    On voit que cela fonctionne. On a 225 x 2 x 2 = 900 octects sans les octets de gestions et cela fonctionne très bien.

    ++

  12. #12
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    ah d'accord, merci

  13. #13
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    mea culpa

    je n'avais pas vu que c'était des nvarchar

    et encore merci messieurs....

    je close

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/08/2012, 09h13
  2. WEBrick error - exceeded the maximum permissible length
    Par leconteconte dans le forum Ruby
    Réponses: 0
    Dernier message: 17/03/2012, 12h23
  3. max key length is 1000 bytes
    Par saramery dans le forum Administration
    Réponses: 0
    Dernier message: 03/05/2010, 18h51
  4. An entry with the same key already exists: qu'est ce?
    Par cortex024 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/04/2007, 16h49
  5. Réponses: 8
    Dernier message: 19/07/2004, 14h34

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