web-dev-qa-db-fra.com

La création d'un index sur une colonne varchar (1024) a réussi. Est-ce que ça marche?

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

6
yobioo

Toutes les versions

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:

SQL Server 2014 et versions antérieures

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.

SQL Server 2016 et plus récent

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.

Insertion de données

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.

Essai

Vous pouvez essayer ceci sur db <> violon . Les liens pour chaque test sont fournis sous les exemples de test.

Limitations de l'index non cluster de Varchar sur SQL Server 2012

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

Limitations des index clusterisés Varchar sur SQL Server 2012

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

Limitations d'index non cluster de Varchar sur SQL Server 2016

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

Limitations de l'index clusterisé Varchar sur SQL Server 2016

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

Sommaire

  • SQL Server 2012 + Index non clusterisé sur Varchar () = 900 caractères max
  • SQL Server 2012 + Index clusterisé sur Varchar () = 900 caractères max
  • Index SQL Server 2016 + non cluster sur Varchar () = 1700 caractères max
  • SQL Server 2016 + Index clusterisé sur Varchar () = 900 caractères max

Ta question

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 .

Références

13
John aka hot2use