Tengo una rutina que creará tablas individuales (Sql Server 2008) para almacenar los resultados de los informes generados por mi aplicación (Asp.net 3.5). Cada informe necesitará su propia tabla, ya que las columnas de la tabla variarán en función de la configuración del informe. Una tabla contendrá entre 10 y 5.000 filas, raramente más de 10.000.¿Hay alguna razón para una columna de clave principal que nunca se usaría?
Se aplicarán las siguientes reglas de uso:
- Una vez almacenados, los datos nunca serán actualizados.
- Cuando se accede a los resultados de la tabla, se recuperarán todos los datos.
- Ninguna otra tabla necesitará realizar una combinación con esta tabla.
Sabiendo esto, ¿hay alguna razón para crear una columna de índice PK en la tabla? Si lo hace, ayudará a la recuperación de los datos de cualquier manera, y si lo hiciera, ¿superaría esto la carga adicional de actualizar el índice al insertar datos (sé que 10K registros es una cantidad relativamente pequeña, pero esta solución debe ser capaz de escalar).
actualización: Aquí están algunos detalles más sobre los datos que están siendo procesados, que entra en la decisión actual diseño de una tabla para cada informe:
- Tablas registrará un conjunto de valores numéricos (establecido en tiempo de ejecución en función de la configuración del informe) que corresponde a un conjunto diferente de valores varchar de referencia (también se establece en el tiempo de ejecución en función de la configuración del informe).
- Cuando se recuperan los datos, se requerirá algún procesamiento posterior en el servidor antes de que la salida pueda mostrarse al usuario (por lo tanto, siempre recuperaré todos los valores).
También sospecho de alguien que afirma que tuvo que crear una nueva tabla para cada vez que se ejecutó el informe. Sin embargo, dado que diferentes columnas (tanto en número, nombre y tipo de datos) podrían ser necesarias para cada vez que se ejecutó el informe, no veo una gran alternativa.
Lo único que puedo pensar es tener una columna de ID (identificando el ReportVersionID, correspondiente a otra tabla), columna ReferenceValues (campo varchar, que contiene todos los valores de referencia, en un orden específico, separados por algún delimitador) y columna NumericValues (igual que los ReferenceValues, pero para los números), y luego cuando recupero los resultados, pongo todo en objetos especializados en el sistema, separando los valores basados en el delimitador definido). ¿Esto parece preferible?
Esto suena muy sospechoso. Prefiero no preguntar por qué :) – leppie
@leppie - ¿Qué es "sospechoso" al respecto? –
Voy a configurar un experto en el servidor Sql para que responda la pregunta. Pero al igual que un FYI, en mi experiencia, agregar índices, _después_ de insertar sus filas casi siempre es una ganancia, sin duda con MySQL y Postgres. Si encuentra que sus consultas se ejecutan más rápido con el índice, intente agregarlo al final después de las inserciones. – Gray