2011-01-27 6 views
6

Tenemos un registro primario que permite a los usuarios ingresar notas. Hay 18 campos de "notas" individuales para cada registro primario.Servidor SQL: ¿Es mejor usar varchar (MAX) o mantener una tabla de notas separada e INNER JOIN?

Actualmente lo hemos normalizado a otra tabla llamada notas, con una columna de clave externa ID y una sola columna varchar (8000), luego simplemente INNER ÚNALAS juntas según sea necesario. Creo que este fue el enfoque recomendado en SQL Server 2000.

Recientemente migramos a SQL Server 2008 que tiene varchar (MAX) y nos preguntamos si es mejor o igual para el rendimiento si nos deshacemos de nuestras notas separadas tabla y use varchar (MAX) en su lugar. Seguro que sería más conveniente.

+0

Mi entendimiento es que varchar (MAX) mantiene los datos reales en una página separada, y solo mantiene un puntero a esa ubicación en la tabla actual. En otras palabras, SQL Server está haciendo internamente lo mismo que estábamos haciendo manualmente. Es eso incorrecto? De todas las respuestas, ciertamente suena como es, pero quería aclarar. Esa es realmente la pregunta que me estoy preguntando. – msigman

+0

No; así era como funcionaba el tipo 'text'. Con 'varchar (max)', esto solo es cierto * cuando el tamaño excede el tamaño máximo de 'varchar' *, que es 8000. Dentro del tamaño máximo, se almacena de la manera tradicional. –

+0

Entendido. Gracias, creo que ahora estoy claro. Lo dejaremos tal como está configurado actualmente. – msigman

Respuesta

3

No estoy del todo claro en su configuración ... si usted está diciendo que el usuario puede ingresar 18 notas individuales (presumiblemente de diferentes "tipos"), entonces debe mantener la tabla de notas secundarias. En este caso, sí, cambiar de varchar(8000) a varchar(MAX) permitirá al usuario almacenar más de 8000 caracteres en las notas.

Para que quede claro, si el usuario está ingresando notas individuales, entonces debe dejar las tablas normalizadas como las tiene ahora. Si debe o no cambiar de varchar(8000) a varchar(max) es una cuestión de si desea o no permitir que los usuarios creen más de 8000 caracteres. Tenga en cuenta que, si lo hacen, el contenido se almacenará fuera de la fila, como si hubiera estado usando el tipo TEXT en SQL Server anterior a 2005.

Si usted está diciendo (como algo que suena como eres) que el usuario puede introducir una gran nota y dinámicamente dividirlo en varios fragmentos de un máximo de 8000 caracteres cada una, a continuación, se debe eliminar la segunda tabla y poner una sola columna varchar(MAX) en el registro principal.

¿Es esto lo que estás preguntando?

+0

Gracias. El usuario está ingresando 18 notas indviduales diferentes. Supongo que no debería haber mencionado 8000, ya que es un problema aparte, como usted menciona. Dejaremos las tablas normalizadas. – msigman

2

El mejor diseño sería mantener la tabla de notas (aún puede aumentar la longitud de la nota mediante el uso de VARCHAR (MAX), lo que introduciría un poco de desaceleración).

Esto le permitirá tratar cada nota independientemente de las otras como entidades separadas en la base de datos.

3

Tener un campo varchar(max) en su tabla "principal" es una mala idea, especialmente si ya lo tiene algo normalizado.

Esto también provocará divisiones de página, fragmentación y un rendimiento realmente deficiente en su mesa principal.

Cuando alguien agrega una nota, si el campo no está en esa tabla de notas, puede llenar la página de datos y hacer que se divida en otra página, que es fragmentación, que es MALO.

0

Me gustaría configurar una sola tabla de notas con una clave principal que consta de la clave externa a su entidad principal y un número de nota, y una sola columna [n] varchar (max). Esto le permite tener múltiples notas por entidad principal.

varchar (max) almacenará hasta 8000 octetos en una sola columna convencional. si el tamaño excede eso (hasta su máximo de 2,1 gb), los datos se extienden a las páginas de desbordamiento, muy parecido al texto [ahora obsoleto]/ntext/image. Tratar con datos de texto/blob era una gran molestia: ahora SQL lo maneja sotto voce, por así decirlo. Todo lo que recibes es una cadena.