Normalizando una mesa extremadamente grande.

Me enfrento al siguiente problema. Tengo una mesa extremadamente grande. Esta tabla es una herencia de las personas que trabajaron anteriormente en el proyecto. La tabla está en MS SQL Server.

La tabla tiene las siguientes propiedades:

Tiene unas 300 columnas. Todos ellos tienen un tipo de "texto" pero algunos de ellos eventualmente deberían representar otros tipos (por ejemplo, entero o fecha y hora). Así que uno tiene que convertir los valores de este texto en tipos apropiados antes de usarlosLa tabla tiene más de 100 filas miliom. El espacio para la mesa pronto alcanzaría 1 terabyte.La tabla no tiene ningún índice.La tabla no tiene ningún mecanismo implementado de partición.

Como puede suponer, es imposible ejecutar una consulta razonable a esta tabla. Ahora la gente solo inserta nuevos registros en la tabla pero nadie los usa. Así que necesito reestructurarlo. Planeo crear una nueva estructura y rellenar la nueva estructura con los datos de la tabla anterior. Obviamente, implementaré el particionamiento, pero no es lo único que se debe hacer.

Una de las características más importantes de la tabla es que los campos que son puramente textuales (es decir, no tienen que convertirse en otro tipo) generalmente tienen valores repetidos con frecuencia. Así que la variedad real de valores en una columna dada está en el rango de 5 a 30 valores diferentes. Esto induce a la idea de hacer una normalización: para cada columna textual crearé una tabla adicional con la lista de todos los valores diferentes que pueden aparecer en esta columna, luego crearé una clave principal (tinyint) en esta tabla adicional y luego utilizará una clave externa apropiada en la tabla original en lugar de mantener esos valores de texto en la tabla original. Luego pondré un índice en esta columna de clave externa. El número de columnas que se procesarán de esta manera es de aproximadamente 100.

Plantea las siguientes preguntas:

¿Esta normalización realmente aumentaría la velocidad de las colas que imponen condiciones en algunos de esos 100 campos? Si olvidamos el tamaño necesario para mantener esas columnas, ¿habrá un aumento en el rendimiento debido a la subestación de las columnas de texto iniciales con las columnas tinyint? Si no hago ninguna normalización y simplemente pongo un índice en esas columnas de texto iniciales, ¿será el rendimiento el mismo que para el índice en la columna tinyint planificada?Si hago la normalización descrita, construir una vista que muestre los valores de texto requerirá unir mi tabla principal con unas 100 tablas adicionales. Un momento positivo es que haré esas uniones para los pares "clave principal" = "clave externa". Pero todavía se debe unir una gran cantidad de tablas. Aquí está la pregunta: si el rendimiento de las consultas realizadas en esta vista en comparación con el rendimiento de las consultas a la tabla inicial no normalizada no será peor. ¿El Optimizador de SQL Server realmente podrá optimizar la consulta de manera que permita aprovechar los beneficios de la normalización?

Lo siento por un texto tan largo.

Gracias por cada comentario!

PS He creado una pregunta relacionada con respecto a unir 100 tablas;Uniendo 100 mesas

Respuestas a la pregunta(4)

Su respuesta a la pregunta