He estado bailando sobre este tema por un tiempo pero sigue apareciendo. Tenemos un sistema y nuestra mayo de nuestras tablas comienza con una descripción que originalmente está almacenada como NVARCHAR(150)
y luego obtenemos un ticket que solicita expandir el tamaño del campo a 250, luego a 1000, etc., ...¿Qué es una forma mantenible de almacenar campos de texto grandes sin sacrificar el rendimiento?
Esto el ciclo se repite en el campo de "nota" siempre y/o el campo "descripción" que agregamos a la mayoría de las tablas. Por supuesto, la preocupación para mí es el rendimiento y romper el límite de 8 k de la página. Sin embargo, mi otra preocupación es hacer que el sistema sea menos sostenible al separar estos campos de TODAS las tablas del sistema en una referencia de carga lenta.
Así que aquí estoy frente a estos mismos a 2 opciones que me han estado mirando a la cara. (otros son bienvenidos) por favor prestenme sus opiniones.
Cambiar todo puede notas y/o descripciones a
NVARCHAR(MAX)
y asegurarnos de que excluimos estos campos en todos los listados. Básicamente, nunca haga un:SELECT * FROM [TableName]
a menos que solo esté recuperando un registro.Elimine todas las notas y/o campos de descripción y reemplácelos con una referencia de clave forign a una tabla
[Notes]
.CREATE TABLE [dbo].[Notes] (
(
[NoteId] [int] NOT NULL,
[NoteText] [NVARCHAR]MAX
)NOT NULL)
Obviamente opción de uso 1 yo preferiría porque va a cambiar tanto en nuestro sistema si vamos con 2. Sin embargo, si la opción 2 es realmente la única Una buena manera de proceder, entonces al menos puedo decir que estos cambios son necesarios y que he hecho la tarea.
ACTUALIZACIÓN: que corrió varias pruebas en una base de datos de muestra con 100.000 registros en el mismo. Lo que encuentro es que debido a que el índice de clúster escanea el IO requerido para la opción 1 es "aproximadamente" el doble que la opción 2. Si selecciono una gran cantidad de registros (1000 o más), la opción 1 es dos veces más lenta incluso si lo hago no incluir el campo de texto grande en la selección. A medida que solicito menos filas, las líneas se difuminan más. Soy una aplicación web en la que el tamaño de página de 50 es la norma, por lo que la opción 1 funcionará, pero convertiré todas las instancias en la opción 2 en el futuro cercano para la escalabilidad.