2012-01-27 24 views
12

Duplicar posible:
is there an advantage to varchar(500) over varchar(8000)?Diferencia entre varchar (5) y varchar (5000)?

En SQL Server podemos especificar el tipo de campo varchar(n):

tamaño de almacenamiento es la longitud real en bytes de los datos introducidos, no n bytes.

A menudo la hora de planificar una estructura de base de datos trato de imaginar la longitud máxima posible de cadenas que se van a almacenar en estos campos y varchar continuación, establezca que el tamaño imaginado + refuerzos para el campo varchar. A veces puede ocurrir que la habitación provista inicialmente no sea suficiente para el campo y luego necesito aumentar la longitud.

Pero en realidad, ¿merece la pena limitar el campo varchar a algún valor y no sólo establecer algo así como varchar(5000) o incluso varchar(max) que será 100% traje el caso? ¿Hay alguna ventaja en la organización de la página en SQL Server u organización del índice cuando limito esa longitud n?

actualización

Aquí es lo que quiero decir (la ventaja): https://stackoverflow.com/a/5353196/355264

Sí, el optimizador de consultas puede adivinar cuántas filas caben en una página, si tiene una gran cantidad de Los campos varchar que son más grandes que los necesarios, SQL El servidor puede adivinar internamente el número incorrecto de filas.

¿Es verdadero el anterior? ¿Y hay otras ventajas?

+1

posible duplicado de [¿hay una ventaja para varchar (500) sobre varchar (8000)?] (http://stackoverflow.com/questions/2009694/is-there-an-advantage-to -varchar500-over-varchar8000) o de [varchar (ma x) en todas partes?] (http://stackoverflow.com/questions/2091284/varcharmax-everywhere) o de [SQL Server VARCHAR Column Width] (http://dba.stackexchange.com/questions/11614/sql-server- varchar-column-width) –

+0

RE: Su edición. Ver [mi respuesta aquí] (http://stackoverflow.com/questions/2009694/is-there-an-advantage-to-varchar500-over-varchar8000/5654947#5654947) –

Respuesta

17

Por un lado, usted NO PUEDE indexar cualquier columna que tenga más de 900 bytes de tamaño.

Eso por sí solo (a mí) es un criterio asesinas contra el uso de varchar(5000) (o varchar(max)) todo el tiempo, incluso si no es necesario ....

Uso del tamaño apropiado.

También: varchar agrega al menos 2 bytes de sobrecarga, por lo que para cadenas de 10 caracteres o menos, siempre recomendaría usar char(n) en su lugar.

char(5) utilizará 5 bytes de almacenamiento, siempre. varchar(5) usa entre 2 y 7 bytes de almacenamiento.

+2

Así que en realidad 'varchar (15)' será lo mismo que 'varchar (500)' en términos de eficiencia y velocidad, ¿verdad? Es decir. si creo que los datos serán de alrededor de 15-20 bytes (tal vez menos o más), ¿puedo especificar 'varchar (150)'? Esta es en realidad mi pregunta principal. –

+0

No entiendo que "siempre" ... la pregunta entre usar varchar (500) o varchar (max) descarta cualquier sugerencia de que las cadenas usualmente serán de 10 caracteres o menos. –

+1

Una columna de tipo 'char (100)' tendrá ** siempre ** exactamente 100 caracteres de longitud, incluso si almacena solo 'Isaac' en ella, se rellenará con la longitud definida (de 100 caracteres) con espacios - así que realmente está almacenando 'Isaac ....................' - que es altamente ineficiente –

12

MS SQL Server almacena varchar (8000) y más corto de forma diferente de varchar (MAX).

El tamaño en el que los tipos MAX se mueven fuera de las páginas de datos de una tabla y en sus propias páginas de datos está fijado en 8.000 bytes si [valor grande tipos de cada fila] está ajustado en OFF.

Hay varias razones por las que usaría el uso varchar (n) en lugar de VARCHAR (MAX)

Rendimiento

varchar (n) es más rápido http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/

Indexación

varchar (900) y más pequeños pueden ser indexados, pero no VARCHAR (MAX) o VARCHAR (901) o más grande

Compatibilidad

MS SQL Server Compact Edition no lo hace soporte varchar (MAX)

Cuestiones relacionadas