2009-05-13 26 views
12

Como parte de una carga masiva de datos de una fuente externa, la tabla de etapas se define con columnas varchar (max). La idea es que cada columna pueda contener lo que encuentre en el archivo CSV fuente, y que validemos los datos (por tipo, tamaño, precisión, etc.) más adelante.sobrecarga de columnas varchar (max) con datos pequeños

Pero me preocupa que la columna varchar (max) tenga una gran sobrecarga para las columnas que tienen menos de 200 caracteres. El tipo que diseñó esto me asegura que esta es la mejor práctica para ETL, pero pensé que validaría esa afirmación con la comunidad.

Respuesta

16

Los valores de la columna VARCHAR (MAX) se almacenarán en la fila de la tabla, si el espacio lo permite. Entonces, si tiene un solo campo VARCHAR (MAX) y tiene 200, 300 bytes, es probable que se almacene en línea con el resto de sus datos. No hay problema ni gastos adicionales aquí.

Solo cuando los datos completos de una sola fila ya no caben en una sola página de SQL Server (8K), solo entonces SQL Server trasladará los datos de VARCHAR (MAX) a páginas de desbordamiento.

Así que en general, creo que obtiene lo mejor de ambos mundos - almacenamiento en línea cuando sea posible, almacenamiento de desbordamiento cuando sea necesario.

Marc

PD: Como señala Mitch, este comportamiento por defecto puede ser apagado - No veo ninguna razón de peso para hacerlo, sin embargo, ....

+0

Tengo una columna varchar (max) que siempre está vacía. Solo está ahí por razones heredadas (y hace que mi código anterior en ASP.net funcione sin cambios). Entonces, si lo hago bien, mi base de datos no se volverá mucho más pequeña (si es que más pequeña) si la elimino. ¿Derecha? – Tillito

+0

Según la respuesta de Jeff Hall, depende del número de filas. Suponiendo 1 Mio. filas que ahorraría 2 MB. ¿Correcto? – Tillito

3

Por lo que yo sé, la sobrecarga que probablemente está pensando (almacenar los datos fuera de la fila de la misma forma que se almacena un valor TEXTO o BINARIO en el servidor sql) solo se aplica si el tamaño de los datos es superior a 8000 bytes. Por lo tanto, no debería haber problemas al usar esto con columnas más pequeñas para procesos ETL.

+2

depende de la configuración de la opción de tabla "tipos de valores grandes fuera de la fila", si se establece en "ENCENDIDO" usará punteros de 16 bytes para almacenar los datos fuera de la tabla. –

+0

Ah, cierto, gracias por ese Mitch. –

+2

Mitch: ¿qué le haría cambiar esa opción? Me parece que perderás todos los beneficios de los tipos MAX, ¿no? –

-1

Bueno, quiero decir que no debería haber una gran sobrecarga porque no creo que sql haya asignado automáticamente una cantidad de datos asignada para nvarchar, y en su lugar solo asigna lo que se necesita para lo que se inserta, pero No tengo nada que probar o respaldar esa idea.

+0

por lo que dices que no lo sabes con certeza, ¿verdad? –

0

Si utiliza un varchar (max) o varbinary (max) en MSSQL2005 SSIS es la creación de un archivo temporal para cada columna en su registro de esto puede dejar que el rendimiento y convertirse en un gran problema. MS afirma que resolvieron este problema en MSSQL2008.

+2

Esto suena muy extraño --- tendrás que respaldarlo con algunas referencias --- por ejemplo, un enlace al "reclamo" de Microsoft –

+0

Lo he visto con mis propios ojos. Tenemos un servidor SSIS con 16 núcleos y 64 gb de RAM y cuando creamos más de 8 millones de registros con varchar (max)/varbinary (max) tomará más de 12 horas para crearlos todos. Pero si usamos varchar (8000)/varchar (8000), entonces estará listo en varios minutos. Trataré de encontrar el reclamo, lo he visto en algún lugar de la red. – JSC

+0

Esto no es exactamente lo que sucede, pero MS dice que mejoraron la asignación de creación de archivos temporales. http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=346675 – JSC

Cuestiones relacionadas