Ajuste de rendimiento para una tabla enorme (SQL Server 2008 R2)

14

Antecedentes:
tengo una tabla de hechos en la fase UAT. Objetivo cargar 5 años de datos en Prod (tamaño esperado 400 Mn registros). Actualmente solo tiene 2 años de datos en Test.

Características de la mesa:

  1. No de dimensiones ~ 45
  2. Medidas ~ 30
  3. Medidas no aditivas y otras columnas ~ 25
  4. Tamaño de datos actual ~ 200 millones (datos de 2 años)
  5. Vista de tiempo: 3 vistas de mes diferentes: Fiscal / Calendario / Ajustado (es decir, la misma fila puede caer en diferentes meses según la vista que se está buscando)
  6. Solo un usuario requerirá una vista a la vez. (es decir, solo se utilizará una columna de un mes en la consulta, nos impide realizar particiones en la vista de tiempo)
  7. Índices: 1 índice agrupado en las teclas naturales (8 columnas). Creó 3 que cubren los índices no agrupados, uno en la columna de cada mes, incluyendo pocos Dimension SK (FK) y todas las medidas).
  8. Los índices son enormes (un total de 190 GB) debido a esto.
  9. El espacio no es restricción (1 TB asignado)
  10. 64 GB de RAM disponibles en el servidor.
  11. Tabla de compresión también realizada.

Requisito: las
consultas en esta tabla de hechos deben dar resultado en 30 segundos (las consultas generales seleccionan la suma (medida) uniendo pocos grupos de Dims por valores de atenuación). Los informes se realizan directamente sobre esta tabla de hechos.

Problema:
cualquier consulta que incluya columnas disponibles en el Índice funciona bien, pero si incluimos cualquier otra columna que no esté incluida en el índice ... Es una mierda. Tarda más de 5-10 minutos. ¿Puede alguien sugerir alguna solución donde funcione bien para cualquier dimensión / columna que seleccionemos? ¿Index puede ver ayuda en esta situación?

usuario1801862
fuente

Respuestas:

6

Actualice a SQL Server 2012 y use almacenes de columnas . Prosperan en estos requisitos. En serio, descarga la edición de evaluación y pruébalo. Descarte todos los índices, descarte el índice agrupado, simplemente agregue un índice de almacén de columnas no agrupado en todas las columnas y dele un giro. He visto casos como el suyo que redujeron el tiempo de ejecución a 2-3 segundos, principalmente debido a la eliminación del segmento . Algunas lecturas complementarias:

Remus Rusanu
fuente
0

¿Una vista indexada resolverá su problema? ¿Qué tan actualizados deben estar los datos? Puede crear una vista indizada para algunas permutaciones. ¡Pero con tantas medidas y medidas puede quedarse sin espacio rápidamente!

¿Qué tal el uso de SSD?

Nick.McDermaid
fuente
Los datos se actualizarán cada mes. ¿Cuánto tiempo llevará actualizar la Vista?
Si su consulta actual tarda entre 5 y 10 minutos, la vista indizada tardará entre 5 y 10 minutos. Cuando finalice, cuando ejecute la misma consulta, volverá como si saliera de una tabla (es decir, inmediatamente). Una vista indexada ejecuta previamente un bit particular de SQL. Si envía SQL que coincide, lo toma de la vista indexada, en lugar de ejecutarlo nuevamente. La principal ventaja de una vista indizada es que no necesita cambiar sus consultas existentes, la usarán automáticamente. La desventaja es que tienes que crear uno para algunas combinaciones diferentes.
Nick.McDermaid
Pero no le sugiero que vaya a crear múltiples vistas indexadas para acelerar las cosas; eventualmente se quedará sin tiempo y espacio en disco. Podría ser una cosa para poner en tu arsenal.
Nick.McDermaid
y por favor ... ¡mira en los almacenes de columnas como se sugiere!
Nick.McDermaid