Lorsque j'ai créé un index sur une colonne varchar (1024) à l'aide de l'interface graphique SSMS, il a échoué avec le message:
"Warning! The maximum key length is 900 bytes. The index 'XXX' has maximum length of 1024 bytes. For some combination of large values, the insert/update operation will fail."
Cependant, la même opération a réussi lorsque j'ai utilisé SQL (pas GUI). Je ne sais pas pourquoi cela s'est produit, mais cela signifie-t-il que l'index fonctionnera jusqu'à ce que les données de plus de 900 octets soient réellement insérées dans la colonne?
(La colonne n'a actuellement pas de valeur supérieure à 900 octets.)
environnement: - SQL Server 2012 - Windows Server 2008 R2 SP1
Si vous créez un index sur une colonne dont la définition est supérieure à 900 ou 1700 (selon la version et le type d'index), vous obtiendrez un avertissement et la création de l'index réussira (si la table est vide ou les données existantes ne sont pas aussi longues) ou une erreur et la création d'index échouera (si une ligne ou plus dépasse la limite).
Pour le cas d'avertissement, les limites sont les suivantes:
Si vous créez un index clusterisé sur une colonne varchar(>900)
, vous recevrez un avertissement lors de la création de l'index.
Si vous créez un index non cluster sur une colonne varchar(>900)
, vous recevrez un message d'avertissement lors de la création de l'index.
Si vous créez un index clusterisé sur une colonne varchar(>900)
, vous recevrez un message d'avertissement lors de la création de l'index.
Si vous créez un index non cluster sur une colonne varchar(>1700)
, vous recevrez un message d'avertissement lors de la création de l'index.
Si vous n'insérez pas plus de données que ce qui est limité par l'index et la version de SQL Server, vous ne recevrez pas de message d'erreur dans votre application/SSMS/SQL Query/...
Cependant, l'insertion de plus que les limites spécifiées par la version et le type d'index entraînera un message d'erreur.
Vous pouvez essayer ceci sur db <> violon . Les liens pour chaque test sont fournis sous les exemples de test.
CREATE TABLE VarcharNonClustered ( ID INT ,Name VARCHAR(2000) ) GO
✓
CREATE NONCLUSTERED INDEX idx_VarcharNonClustered_Name ON VarcharNonClustered(Name) GO
✓ Attention! La longueur de clé maximale est de 900 octets. L'index 'idx_VarcharNonClustered_Name' a une longueur maximale de 2000 octets. Pour certaines combinaisons de grandes valeurs, l'opération d'insertion/mise à jour échouera.
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1701 octets pour l'index 'idx_VarcharNonClustered_Name' dépasse la longueur maximale de 900 octets.
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1700)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1700 octets pour l'index 'idx_VarcharNonClustered_Name' dépasse la longueur maximale de 900 octets.
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',901)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 901 octets pour l'index 'idx_VarcharNonClustered_Name' dépasse la longueur maximale de 900 octets.
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',900)) GO
1 lignes affectées
db <> violon ici
CREATE TABLE VarcharClustered ( ID INT ,Name VARCHAR(2000) ) GO
✓
CREATE CLUSTERED INDEX idx_VarcharClustered_Name ON VarcharClustered(Name) GO
✓ Attention! La longueur de clé maximale est de 900 octets. L'index 'idx_VarcharClustered_Name' a une longueur maximale de 2000 octets. Pour certaines combinaisons de grandes valeurs, l'opération d'insertion/mise à jour échouera.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1701 octets pour l'index 'idx_VarcharClustered_Name' dépasse la longueur maximale de 900 octets.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1700)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1700 octets pour l'index 'idx_VarcharClustered_Name' dépasse la longueur maximale de 900 octets.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',901)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 901 octets pour l'index 'idx_VarcharClustered_Name' dépasse la longueur maximale de 900 octets.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',900)) GO
1 lignes affectées
db <> violon ici
CREATE TABLE VarcharNonClustered ( ID INT ,Name VARCHAR(2000) ) GO
✓
CREATE NONCLUSTERED INDEX idx_VarcharNonClustered_Name ON VarcharNonClustered(Name) GO
✓ Attention! La longueur de clé maximale pour un index non cluster est de 1700 octets. L'index 'idx_VarcharNonClustered_Name' a une longueur maximale de 2000 octets. Pour certaines combinaisons de grandes valeurs, l'opération d'insertion/mise à jour échouera.
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1701 octets de longueur pour l'index 'idx_VarcharNonClustered_Name' dépasse la longueur maximale de 1700 octets pour les index non clusterisés.
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1700)) GO
1 lignes affectées
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',901)) GO
1 lignes affectées
INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',900)) GO
1 lignes affectées
db <> violon ici
CREATE TABLE VarcharClustered ( ID INT ,Name VARCHAR(2000) ) GO
✓
CREATE CLUSTERED INDEX idx_VarcharClustered_Name ON VarcharClustered(Name) GO
✓ Attention! La longueur de clé maximale pour un index cluster est de 900 octets. L'index 'idx_VarcharClustered_Name' a une longueur maximale de 2000 octets. Pour certaines combinaisons de grandes valeurs, l'opération d'insertion/mise à jour échouera.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1701 octets de longueur pour l'index 'idx_VarcharClustered_Name' dépasse la longueur maximale de 900 octets pour les index clusterisés.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1700)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 1700 octets pour l'index 'idx_VarcharClustered_Name' dépasse la longueur maximale de 900 octets pour les index clusterisés.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',901)) GO
Msg 1946 Niveau 16 État 3 Ligne 1 Échec de l'opération. L'entrée d'index de 901 octets pour l'index 'idx_VarcharClustered_Name' dépasse la longueur maximale de 900 octets pour les index clusterisés.
INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',900)) GO
1 lignes affectées
db <> violon ici
La création d'un index sur une colonne varchar (1024) a réussi. Est-ce que ça marche?
Cela fonctionnera avec les limitations ci-dessus .