¿Debo usar siempre (n)varchar(max)
para columnas de texto?
No.
Para SQL Server, los max
tipos de datos solo deben especificarse cuando no hay alternativa. En su lugar, se debe elegir el tipo base correcto ( varchar
o nvarchar
) y especificar una longitud máxima explícita que sea apropiada para los datos que se almacenarán.
El almacenamiento físico es idéntico si la columna se escribe como varchar(n)
o varchar(max)
, por lo que no es un problema.
Las razones para no elegir en (n)varchar(max)
todas partes giran en torno a las características, la calidad del plan y el rendimiento.
Una lista exhaustiva probablemente no sea práctica, pero entre otras cosas, max
columnas:
Caracteristicas
- Requerir una restricción separada para imponer una longitud máxima
- No puede ser una clave en un índice (por lo que tampoco hay restricciones únicas)
- Puede evitar el DDL en línea (incluidas las reconstrucciones de índice y la adición de una nueva columna no nula)
- Por lo general, no son compatibles con las funciones 'más nuevas', por ejemplo, almacén de columnas
- Consulte la documentación del producto para obtener características y limitaciones más específicas. El patrón general es que existen limitaciones y restricciones incómodas en torno a
max
los tipos de datos. No todas las limitaciones y efectos secundarios están documentados.
Actuación
- Requiere un manejo especial en el motor de ejecución, para tener en cuenta el tamaño potencialmente muy grande. Por lo general, esto implica el uso de una ruta de código menos eficiente, con una interfaz de transmisión
- Puede tener consecuencias imprevistas similares para el código externo (y otros componentes de SQL Server como SSIS), que también deben estar preparados para manejar datos de hasta 2 GB de tamaño
- Se supone que tienen 4000 bytes de ancho en los cálculos de concesión de memoria. Es probable que esto conduzca a una reserva de memoria excesiva, lo que limita la concurrencia y elimina valiosas páginas de índice y datos de la memoria caché
- Deshabilite varias optimizaciones de rendimiento importantes
- Puede extender la duración del bloqueo
- Puede evitar que el optimizador elija un plan de búsqueda (no dinámico)
- Evita que los filtros se inserten en escaneos y se busque como residual
- Puede aumentar la presión y la contención de tempdb (depende de la versión), ya que también es probable que las variables y los parámetros se tomen
max
para que coincidan con las definiciones de columna
En resumen, hay tantos efectos secundarios sutiles (e indeseables) de usar innecesariamente el max
especificador que no tiene sentido hacerlo. La "conveniencia" menor de usar una sola declaración no es ningún tipo de compensación.
Evalúe cada tipo en contexto, use el tipo base correcto ( varchar
o nvarchar
) y una longitud explícita sensible.
Otras lecturas:
Paul White dice GoFundMonica
fuente
varchar(not-max)
parámetros, así que me quedé un poco en la boca aquí. Pero sí, la inyección SQL sería aplicable aquí. Quizás debería reformular un poco esta respuesta.