No momento, estamos enfrentando alguns problemas de desempenho, pois nosso banco de dados está ficando muito grande. Há dados armazenados dos últimos 10 anos e não vejo motivo para que os dados com mais de 2 anos tenham que ser armazenados nas mesmas tabelas que os novos dados.
Agora, como não tenho experiência muito profunda em administrar bancos de dados, estou procurando as melhores maneiras de arquivar dados antigos.
Informações
Existem cerca de 310.000.000 registros no banco de dados no total.
O banco de dados precisa de 250 GB no disco rígido.
- A versão do servidor é o SQL Server 2008 com nível de compatibilidade SQL Server 2005 (90), mas planejamos atualizar para o SQL Server 2012 em breve
Já pensei em duas possibilidades:
Novo banco de dados
Crie um banco de dados semelhante ao do servidor de produção e insira todos os dados antigos no novo banco de dados.
- Desvantagem: Como os servidores vinculados não são permitidos em nosso ambiente, seria difícil juntar os dados antigos, se necessário
Esquema de histórico
Crie um novo esquema fe [hist] com as mesmas tabelas do banco de dados de produção. Insira todos os dados antigos nessas novas tabelas no novo esquema.
- Vantagem: Fácil adesão, se dados antigos forem necessários no futuro
- Você prefere uma das soluções sobre a outra?
- Por quê?
- Existem possibilidades melhores?
- Existem ferramentas existentes com as quais essa tarefa é facilmente possível?
- Algum outro pensamento?
desde já, obrigado
Editar
Pergunta adicional:
A tabela de arquivos recém-criada também precisaria de chaves primárias/estrangeiras?
Ou eles deveriam ter apenas as colunas, mas sem chaves/restrições?
Acho que a resposta para muitas de suas perguntas é que depende. Quais problemas de desempenho você está tendo? Parece incomum que um banco de dados tenha problemas de desempenho apenas crescendo para 250 GB de tamanho.
Talvez suas consultas estejam realizando varreduras de tabela em toda a tabela de fatos, mesmo quando apenas uma pequena parte (por exemplo, o último ano) do intervalo de datas é necessária? Se houver uma consulta específica que seja mais importante para otimizar, considere postar seu esquema, consulta e um plano de execução real em outra pergunta para ver se ela pode ser otimizada.
Eu geralmente prefiro o banco de dados de histórico e acho que Guy descreve boas razões para isso em sua resposta .
A principal desvantagem que vejo para um banco de dados de histórico (em oposição a um esquema) é que você não pode mais usar chaves estrangeiras para sua tabela de arquivo. Isso pode ser bom para você, mas é algo para estar ciente.
A desvantagem que você listou para essa abordagem não é precisa; você poderá consultar facilmente entre bancos de dados no mesmo servidor e o otimizador de consulta geralmente lida muito bem com consultas entre bancos de dados.
Se você precisar consultar os dados de arquivo regularmente, considere particionar a tabela por data . No entanto, esta é uma grande mudança que pode vir com muitas implicações de desempenho, tanto positivas (por exemplo, eliminação de partição, carregamento de dados mais eficiente) quanto negativas (por exemplo, buscas singleton mais lentas, maior potencial para desvio de encadeamento em consultas paralelas). Portanto, eu não tomaria essa decisão de ânimo leve se for um banco de dados muito usado.
Eu recomendaria ter pelo menos a chave primária e os índices exclusivos para que você possa obter os benefícios de integridade de dados que eles oferecem. Por exemplo, isso impedirá que você insira acidentalmente um ano de dados na tabela de histórico duas vezes. E, como benefício colateral, pode melhorar o desempenho se você precisar consultar a tabela de histórico.
Como você está usando a edição Enterprise e planeja atualizar para o SQL 2008+, considere a compactação de dados para esta tabela. A compactação certamente reduzirá o espaço em disco, mas dependendo do disco do servidor e dos recursos da CPU, ela também pode melhorar o desempenho da consulta para leituras, reduzindo a E/S do disco e melhorando a utilização da memória (mais dados cabem no cache de uma só vez).
Eu preferiria ter um esquema de histórico ou um segundo banco de dados histórico em um servidor vinculado a qualquer dia. Ele economiza custos de licença é mais fácil de gerenciar e consultar. Você também pode usar um esquema mais simples e descartar alguns dos índices, tornando o banco de dados menor
Mas como você tem a edição corporativa você tem a terceira opção que é particionar suas tabelas o que, quando colocado em prática facilita o arquivamento dos dados e a consulta dos dados antigos é transparente para seus usuários e você não precisará fazer alterações no aplicativo .
Na minha experiência, um segundo banco de dados seria a escolha preferida por dois motivos.
Você ainda precisaria excluir todos os dados históricos do banco de dados primário, mas isso poderia ser agendado.
Ignorando a licença por enquanto, pois não é onde passo meu tempo.
IMHO, banco de dados de arquivo é mais simples de implementar e manter. São entidades distintas e fracamente acopladas. A movimentação de dados e os controles de carga/recurso têm limites claros. Pode mover-se facilmente para uma instância ou servidor diferente para melhor gerenciamento de desempenho e custo não é um problema importante. Note que mais simples != mais barato ou menos esforço. Na verdade, ele tem um pouco mais de tarefas, mas todas são tarefas simples, com duas exceções importantes:
O esquema de arquivamento ou apenas a tabela de arquivamento é um pouco mais complexo de implementar, mas muito mais fácil de usar. Todos os objetos no mesmo banco de dados significam que você não precisa replicar e manter controles de acesso. Sem consultas cruzadas de banco de dados, facilitando o ajuste de desempenho, monitoramento, solução de problemas etc.
O particionamento de tabela é uma ótima solução e oferece muitos dos benefícios de uma tabela/esquema de arquivamento, mas fornece transparência para usuários/consultas. Dito isto, é o mais complexo de implementar e requer cuidados contínuos que não são fáceis para um iniciante.
Algumas considerações importantes:
Essas são considerações importantes, pois podem ter um impacto significativo na solução escolhida ou podem até não permitir determinadas soluções. Por exemplo, se seus dados históricos são modificados/atualizados regularmente (mais de uma vez por semana), usar um banco de dados separado significa que você precisa usar o DTC para essas consultas ou gerenciar manualmente a segurança da transação (não trivial para garantir sempre a correta). O custo é significativamente maior do que os dados históricos imutáveis.
Além disso, se você está pensando em atualizar, considere 2016 e o novo recurso Stretch Database: https://msdn.microsoft.com/en-us/library/dn935011.aspx
Eu preferiria dividir o banco de dados em um banco de dados lógico separado pelos seguintes motivos:
1. Requisitos de recursos
Ao dividir isso em um banco de dados separado, ele pode ser armazenado em uma unidade diferente e monitorado em uma taxa diferente dos dados de produção principais.
2. Desempenho
Ao dividir os dados em um banco de dados separado, o banco de dados principal de Produção é reduzido em tamanho, ajudando no desempenho geral.
3. Backups mais simples
O backup de dados arquivados pode não ser considerado tão essencial quanto os registros 'vivos/atuais' no banco de dados SQL principal. Isso pode significar que os dados arquivados podem ser copiados com menos frequência. Também devido à natureza sequencial de como os dados arquivados são registrados, pode ser possível fazer backup de seções do banco de dados arquivado uma vez e nunca mais. Por exemplo, uma vez que os dados do arquivo sejam gravados no banco de dados do arquivo Change para 2014, nunca haverá nenhuma alteração nesses dados novamente.
Observação: acho que a resposta para muitas de suas perguntas depende de suas circunstâncias, natureza dos dados e problemas de desempenho que você estava tendo.