Mis dos preguntas son:Índices agrupados en columnas que no son de identidad para acelerar inserciones masivas?
- ¿Puedo usar los índices agrupados para acelerar hasta inserciones masivas en grandes mesas?
- ¿Puedo seguir utilizando eficientemente las relaciones de clave foránea si mi columna IDENTIDAD ya no es el índice agrupado ?
Para elaborar, tengo una base de datos con un par de tablas muy grandes (entre 100-1000 mln filas) que contienen datos de la empresa. Por lo general, hay datos de entre 20 y 40 empresas en dicha tabla, cada una como su propio "fragmento" marcado por "identificador de empresa" (INT). Además, cada empresa tiene alrededor de 20 departamentos, cada uno con su propio "subchunk" marcado por "DepartmentIdentifier" (INT).
Ocurre con frecuencia que se agregue o elimine toda una "porción" o "subchunk" de la tabla. Lo primero que pensé fue utilizar Table Partitioning en esos fragmentos, pero como estoy usando SQL Server 2008 Standard Edition, no tengo derecho. Aún así, la mayoría de las consultas que tengo se ejecutan en un "fragmento" o "subchunk" en lugar de en la tabla como un todo.
He estado trabajando para optimizar estas tablas para las siguientes funciones:
- consultas que se ejecutan en subfragmentos
- consultas "marco de referencia" que se ejecutan en la tabla en su conjunto
- Inserción/eliminando grandes trozos de datos.
Para 1) y 2) No he encontrado muchos problemas. He creado varios índices en campos clave (que también contienen CompanyIdentifier y DepartmentIdentifier, donde es útil) y las consultas se ejecutan correctamente.
Pero para 3) he tenido problemas para encontrar una buena solución. Mi primera estrategia fue desactivar siempre los índices, insertar a granel un gran bloque y reconstruir índices. Esto fue muy rápido al principio, pero ahora que hay muchas compañías en la base de datos, se necesita mucho tiempo para reconstruir el índice cada vez.
Por el momento, mi estrategia ha cambiado a simplemente dejar el índice encendido durante la inserción, ya que ahora parece ser más rápido. Pero quiero optimizar aún más la velocidad de inserción.
Parece que he notado que al agregar un índice agrupado definido en CompanyIdentifier + DepartmentIdentifier, la carga de nuevos "fragmentos" en la tabla es más rápida. Antes de abandonar esta estrategia a favor de agregar un índice agrupado en una columna de IDENTIDAD, varios artículos me indicaron que el índice agrupado está contenido en todos los demás índices, por lo que el índice agrupado debería ser lo más pequeño posible. Pero ahora estoy pensando en revivir esta vieja estrategia para acelerar los insertos. Mi pregunta, ¿sería prudente o sufriré éxitos de rendimiento en otras áreas? ¿Y esto realmente acelerará mis insertos o es solo mi imaginación?
Tampoco estoy seguro de si en mi caso es realmente necesaria una columna de IDENTIDAD. Me gustaría poder establecer relaciones de claves externas con otras tablas, pero ¿también puedo usar algo como un esquema CompanyIdentifier + DepartmentIdentifier + [uniquifier] para eso? ¿O tiene que ser un número de IDENTIDAD fragmentado en toda la mesa?
Muchas gracias por cualquier sugerencia o explicación.
¿Ha buscado Vistas particionadas para resolver su problema de "trozos" o no son adecuadas? –
No creo que pueda usarlos en SQL Server Standard Edition. – thomaspaulb
Sí, estos están disponibles en edición estándar. –