2012-10-03 31 views
32

Cuál es el límite de caracteres totales para un límite de índice de 900 bytes que tiene SQL Server 2012. Creé una columna que tiene varchar(2000), pero creo que excede los 900 bytes que SQL Server limitó? ¿Cuál sería un máximo de varchar(?) para caber dentro de la columna de índice de 900 bytes?Límite de tamaño de índice de 900 bytes en la longitud de caracteres

+0

depende Probablemente en el conjunto de caracteres de la tabla utiliza –

+0

El conjunto de caracteres más pequeña que he utilizado tenía 1 byte por carbón. Supongo que el tuyo es al menos así de grande. – keyser

+0

Es un software SQL Server 2012 de 64 bits. Nada especial sobre conjuntos de personajes. Solo Windows 8 de 64 bits ejecutando SQL Server 2012 64 bits de fábrica. Windows EE. UU.-Inglés. – iefpw

Respuesta

47

El tamaño de almacenamiento para varchar es la longitud real de los datos ingresados ​​+ 2 bytes. Aunque la columna en sí tiene esa sobrecarga de 2 bytes, puede poner hasta 900 byte valores varchar en una columna indexada.

En la práctica, puede crear un índice en una columna mayor de 900 bytes de tamaño, pero tendrá un problema si en realidad se trata de inserción algo más grande que 900 bytes:

create table test (
    col varchar(1000) 
); 
create index test_index on test (col); 
-- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail. 
insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success 
insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success 
insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail 
-- Msg 1946, Level 16, State 3, Line 8 
-- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes. 

Tenga en cuenta que el límite de 900 bytes incluye todas las columnas de una clave de índice dado, como muestra este ejemplo:

create table test (
     col varchar(1000) 
    , otherCol bit -- This column will take a byte out of the index below, pun intended 
); 
create index test_index on test (col, otherCol); 
insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success 
insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail 
insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail 

por estas columnas que normalmente son demasiado grandes para un índice de ke y, puede obtener algunos beneficios de la indexación por including en un índice.

8

En una nota relacionada, otra opción que puede probar, para obtener un índice en una columna ancha, se describe en http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in-sql-server/ donde se agrega una columna hash a la tabla, luego se indexa y se utiliza en sus consultas.

+2

¡Utilicé la función 'HASHBYTE' con gran efecto, gracias! El OP discutía SQLServer2012, pero tenga en cuenta que el algoritmo 'SHA2_512' solo se introdujo en SQLServer2012, por lo que si está utilizando una versión anterior debe usar un algoritmo diferente, ya que especificar' SHA2_512' para versiones anteriores simplemente devuelve 'null'. Aquí están los [documentos para 2008] (http://technet.microsoft.com/en-us/library/ms174415%28v=sql.100%29.aspx). Por ejemplo: 'seleccione HASHBYTES ('SHA2_512', 'The quick brown fox') como sha2_512, HASHBYTES ('MD5', 'The quick brown fox') como md5, HASHBYTES ('SHA1', 'The quick brown fox') como sha1'. – DarthPablo

1

Para aquellos con SQL Server 2016, el índice de tamaño de la clave se aumentó a 1700 bytes .. What's new in Database Engine - SQL Server 2016

El tamaño máximo índice de clave para los índices no agrupados se ha aumentado a 1700 bytes.

Demostración: (? América-8859)

create table test 
(
id varchar(800), 
id1 varchar(900) 
) 

insert into test 
select replicate('a',800),replicate('b',900) 

create index nci on test(id,id1) 
Cuestiones relacionadas