Normalizando uma mesa extremamente grande

Eu enfrento o seguinte problema. Eu tenho uma mesa extremamente grande. Esta tabela é uma herança das pessoas que trabalharam anteriormente no projeto. A tabela está no MS SQL Server.

A tabela tem as seguintes propriedades:

Tem cerca de 300 colunas. Todos eles têm o tipo "texto", mas alguns deles eventualmente devem representar outros tipos (por exemplo, número inteiro ou datetime). Portanto, é preciso converter esses valores de texto em tipos apropriados antes de usá-losa tabela tem mais de 100 miliom linhas. O espaço para a tabela logo alcançaria 1 terabytea tabela não tem nenhum índicea tabela não possui nenhum mecanismo implementado de particionamento.

Como você pode imaginar, é impossível executar qualquer consulta razoável para esta tabela. Agora as pessoas só inserem novos registros na tabela, mas ninguém a usa. Então eu preciso reestruturar isso. Eu pretendo criar uma nova estrutura e preencher a nova estrutura com os dados da tabela antiga. Obviamente, vou implementar o particionamento, mas não é a única coisa a ser feita.

Uma das características mais importantes da tabela é que os campos que são puramente textuais (ou seja, não precisam ser convertidos em outro tipo) geralmente têm valores repetidos com freqüência. Portanto, a variedade real de valores em uma determinada coluna está no intervalo de 5-30 valores diferentes. Isso induz a idéia de fazer a normalização: para cada coluna textual eu vou criar uma tabela adicional com a lista de todos os diferentes valores que podem aparecer nesta coluna, então eu vou criar uma chave primária (tinyint) nesta tabela adicional e Em seguida, usará uma chave estrangeira apropriada na tabela original em vez de manter esses valores de texto na tabela original. Então vou colocar um índice nessa coluna de chave estrangeira. O número de colunas a serem processadas dessa forma é cerca de 100.

Isso levanta as seguintes questões:

esta normalização aumentaria realmente a velocidade dos que imponham condições em alguns desses 100 campos? Se nos esquecermos do tamanho necessário para manter essas colunas, se haveria algum aumento no desempenho devido à subseção das colunas de texto iniciais com tinyint-columns? Se eu não fizer qualquer normalização e simplesmente colocar um índice nessas colunas de texto iniciais, se a performace será a mesma que para o índice na tinyint-column planejada?Se eu fizer a normalização descrita, a criação de uma exibição que mostre os valores de texto exigirá a inclusão da minha tabela principal com cerca de 100 tabelas adicionais. Um momento positivo é que eu vou fazer essas junções para os pares "chave primária" = "chave estrangeira". Mas ainda assim uma grande quantidade de tabelas deve ser unida. Aqui está a pergunta: se o desempenho das consultas feitas a esta visão se compara ao desempenho das consultas para a tabela inicial não normalizada não será pior? Se o Otimizador do SQL Server realmente conseguirá otimizar a consulta da maneira que permita aproveitar os benefícios da normalização?

Desculpe por um texto tão longo.

Obrigado por cada comentário!

PS Eu criei uma pergunta relacionada sobre como ingressar em 100 tabelas;Juntando 100 mesas

questionAnswers(4)

yourAnswerToTheQuestion