Ajuste de desempenho para tabela enorme (SQL Server 2008 R2)

14

Antecedentes:
Eu tenho uma tabela de fatos na fase UAT. Objetivo de carregar 5 anos de dados no Prod (tamanho esperado de registros de 400 Mn). Atualmente, possui apenas 2 anos de dados em teste.

Recursos da tabela:

  1. Nº de dimensões ~ 45
  2. Medidas ~ 30
  3. Medidas não aditivas e outras colunas ~ 25
  4. Tamanho atual dos dados ~ 200 milhões (dados de 2 anos)
  5. Exibição de tempo: 3 exibições mensais diferentes: fiscal / calendário / ajustado (ou seja, a mesma linha pode cair em meses diferentes, com base na exibição que se procura)
  6. Somente uma visualização será necessária por vez por um usuário. (ou seja, apenas uma coluna do mês será usada na consulta, isso nos impede de particionar na exibição de tempo)
  7. Índices: 1 Índice agrupado nas chaves naturais (8 colunas) .Criado 3 cobrindo índices não agrupados, um na coluna de cada mês, incluindo poucas SKs de dimensão (FKs) e todas as medidas).
  8. Os índices são enormes (total de 190 GB) por causa disso.
  9. O espaço não é restritivo (1 TB alocado)
  10. 64 GB de RAM disponível no servidor.
  11. A compactação de tabela também foi concluída.

Requisito: as
consultas nesta tabela de fatos devem fornecer o resultado dentro de 30 segundos (as consultas gerais selecionam a soma (medida) que une poucos grupos de dimensões a valores de dimensão). Os relatórios são feitos diretamente na parte superior desta tabela de fatos.

Problema:
qualquer consulta que inclua colunas disponíveis no Índice funciona bem, mas se incluirmos outras colunas que não estão na inclusão ... É uma porcaria. Demora mais de 5 a 10 minutos. Alguém pode sugerir alguma solução onde funcione bem para qualquer dimensão / coluna que selecionamos. O Index pode exibir ajuda nessa situação?

user1801862
fonte

Respostas:

6

Atualize para o SQL Server 2012 e use armazenamentos de colunas . Eles prosperam nesses requisitos. Sério, baixe a edição de avaliação e experimente. Solte todos os índices, solte o índice em cluster, simplesmente adicione um índice columnstore não em cluster em todas as colunas e gire. Vi casos como o seu que reduziram o tempo de execução para 2-3 segundos, principalmente por causa da eliminação do segmento . Algumas leituras complementares:

Remus Rusanu
fonte
0

Uma exibição indexada resolverá seu problema? Até que ponto os dados precisam estar atualizados? Você pode criar uma exibição indexada para algumas permutações. Mas com tantas dimensões e medidas, você pode ficar sem espaço rapidamente!

Que tal usar SSDs?

Nick.McDermaid
fonte
Os dados serão atualizados todos os meses. Quanto tempo leva para atualizar a Visualização?
Se a sua consulta existente demorar de 5 a 10 minutos, a exibição indexada levará de 5 a 10 minutos. Quando concluída, quando você executa a mesma consulta, ela volta como se estivesse saindo de uma tabela (ou seja, imediatamente). Uma exibição indexada pré-executa um determinado bit de SQL. Se você enviar um SQL que corresponda a ele, ele será retirado da exibição indexada, em vez de executá-lo novamente. A principal vantagem de uma exibição indexada é que você não precisa alterar suas consultas existentes, elas a usarão automaticamente. A desvantagem é que você praticamente precisa criar uma para algumas combinações diferentes.
Nick.McDermaid
Mas não sugiro que você crie várias visualizações indexadas para acelerar as coisas - você acabará ficando sem tempo e espaço em disco. Pode ser apenas uma coisa para colocar em seu arsenal.
Nick.McDermaid
e por favor ... consulte as lojas de colunas, conforme sugerido!
Nick.McDermaid