length - varchar sql server
¿Por qué no usar varchar(max)? (7)
Soy un poco viejo cuando se trata de diseño de bases de datos, así que estoy totalmente de acuerdo con el uso de los tamaños de datos correctos en columnas. Sin embargo, al revisar una base de datos para un amigo, noté que usaba mucho varchar(max)
. Ahora, mi pensamiento inmediato fue devolvérselo y decirle que lo cambie. Pero luego lo pensé y no pude encontrar una buena razón para que él no lo usara (había usado una herramienta de tipo de caso para generar el DB, si te estás preguntando).
He estado investigando el tema del uso de varchar(max)
y realmente no puedo encontrar una buena razón para que no lo use.
Él no usa las columnas para los índices, la aplicación que se encuentra en el archivo db tiene limitaciones en la entrada, por lo que no permitirá entradas masivas en los campos.
Cualquier ayuda sería apreciada para ayudarme a hacerle ver la luz :).
Es algo anticuado creer que la aplicación solo pasará cadenas cortas a la base de datos, y eso lo hará funcionar .
En los tiempos modernos, TIENE que anticipar que se accederá a la base de datos principalmente por la aplicación actual, pero puede haber una versión futura de la aplicación (¿sabe el desarrollador de esa versión mantener las cadenas por debajo de cierta longitud?)
DEBE anticipar que los servicios web, los procesos ETL, LYNC a SQL y cualquier otra cantidad de tecnologías ya existentes y / o no existentes se utilizarán para acceder a su base de datos.
En general, trato de no pasar por varchar (4000), porque son cuatro mil caracteres , después de todo. Si lo supero, busco otros tipos de datos para almacenar lo que estoy tratando de almacenar. Brent Ozar ha escrito algunas cosas geniales sobre esto.
Dicho todo esto, es importante evaluar el enfoque del diseño actual para sus requisitos actuales cuando está trabajando en un proyecto. Tenga una idea de cómo funcionan las distintas partes, comprenda las ventajas y desventajas de los distintos enfoques y resuelva el problema. El ejercicio de un gran axioma puede llevar a una adherencia ciega que podría convertirlo en un lemming .
Hay una publicación en el blog sobre por qué no usar varchar max here
Editar
La diferencia básica es donde se almacenan los datos. Una fila de Datos SQL tiene un tamaño máximo de 8000 bytes (o era 8K). Entonces no se puede almacenar un varchar de 2GB (max) en la fila de datos. SQL Server lo almacena "Fuera de la fila".
Por lo tanto, podría obtener un golpe de rendimiento ya que los datos no estarán en el mismo lugar en el disco, consulte: http://msdn.microsoft.com/en-us/library/ms189087.aspx
La diferencia está en el siguiente:
VARCHAR(X)
se puede indexar y almacenar en el archivo de datos MDF/NDF
.
VARCHAR(MAX)
no se puede indexar porque puede alcanzar un volumen alto y luego se almacenará como un archivo separado y no en el archivo de datos MDF/NDF
.
Mi respuesta a esto, no es sobre el uso de Max, tanto como sobre el motivo de VARCHAR (max) frente a TEXT.
En mi libro; en primer lugar, a menos que pueda estar absolutamente seguro de que nunca codificará nada más que texto en inglés y la gente no se referirá a nombres de ubicaciones extranjeras, entonces debe usar NVARCHAR o NTEXT.
En segundo lugar, es lo que los campos te permiten hacer.
TEXT es difícil de actualizar en comparación con VARCHAR, pero se obtiene la ventaja de la indización de texto completo y muchas cosas inteligentes.
Por otro lado, VARCHAR (MAX) tiene cierta ambigüedad, si el tamaño de la celda es <8000 caracteres, se tratará como Datos de fila. Si es mayor, se tratará como un LOB para fines de almacenamiento. Debido a que no puede saber esto sin consultar RBAR, esto puede tener estrategias de optimización para los lugares donde necesita estar seguro acerca de sus datos y cuántas lecturas cuestan.
De lo contrario, si tu uso es relativamente mundano y no esperas tener problemas con el tamaño de los datos (por ejemplo, estás usando .Net y por lo tanto no tienes que preocuparte por el tamaño de tus objetos de cadena / char *) luego usar VARCHAR (max) está bien.
NO deben usarse a menos que espere grandes cantidades de datos y esta es la razón por la cual (directamente de Books Online):
Las columnas que son tipos de datos de objeto grande (LOB) ntext, text, varchar (max), nvarchar (max), varbinary (max), xml o image no se pueden especificar como columnas clave para un índice.
Si quieres paralizar el rendimiento, utiliza nvarchar para todo.
No sé cómo el servidor sql maneja campos varchar grandes (declarados) desde una perspectiva de rendimiento, memoria y almacenamiento ... pero suponiendo que lo haga tan eficientemente como campos varchar declarados más pequeños, aún existe el beneficio de las restricciones de integridad.
Se supone que la aplicación que se encuentra en el db tiene límites en la entrada, pero la base de datos puede informar correctamente un error si la aplicación tiene un error al respecto.
Si trabaja en un entorno OLTP, todo se trata del rendimiento. Desde preocupaciones generales y de ajuste hasta limitaciones de indexación y cuellos de botella de consultas. Usar un varcahr (máximo) o cualquier otro tipo de LOB es muy probable que contravenga la mayoría de las mejores prácticas de diseño, a menos que exista una necesidad comercial específica que no se pueda manejar mediante el uso de algún otro mecanismo de tipeo y solo varchar (max) Entonces, ¿por qué somete su sistema y sus aplicaciones al tipo de problemas de sobrecarga y rendimiento inherentes a uno de los tipos de datos LOB?
Si, por otro lado, está trabajando en un entorno OLAP o en un entorno Star Schema DW con tablas de dimensión con campos de descriptores que, naturalmente, deben ser detallados, entonces varchar (max), siempre que no lo agregue a un índice, puede ser útil. De todos modos, recomendaría incluso usar un char (x) varchar (x). Siempre es una buena práctica usar solo los recursos que debe tener para realizar el trabajo.