Eu preciso atualizar 100 milhões de registros em uma única tabela, com efeito, normalizando a tabela substituindo o valor varchar de uma coluna por simplesmente um ID. (Eu digo "substituindo", mas realmente estou escrevendo o ID em outra coluna.)
O que estou tentando alcançar é normalizar o conjunto de dados. Os dados ainda não normalizados não possuem indexação. Meu pensamento era que eu não criaria índices nos valores brutos, esperando, em vez disso, indexar as chaves estrangeiras que substituirão os valores varchar pelos valores tinyint após a conclusão da atualização.
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
fundo
- usando o MSSQL 2008 R2 no Server 2008 R2
- servidor tem 8 GB de RAM
- o servidor possui um RAID10, 7200 RPM SATA (nada bom, eu sei, na produção, isso só lerá dados e não gravará dados; além da recente escassez de HD necessária para o custo)
- servidor tem CPU Xeon quad-core dupla
- a máquina não está fazendo mais nada (atualmente dedicado ao dev, somente esse processo)
- log simples ativado (? - mas ele ainda faz logon para que possa reverter?)
- observe que a consulta faz referência a dois bancos de dados diferentes, pelo que vale a pena
- "largura" de um registro na tabela sendo atualizado é de 455 bytes
Recursos durante a execução
- a RAM física está no máximo
- a E / S do disco está no limite máximo
- A CPU quase não está fazendo nada (o ponto de estrangulamento é a E / S)
- tempo de execução foi de 14 horas e contando!
Suspeito de algumas coisas, como eu preciso de um índice nos dados brutos, mesmo depois de soltar a coluna (AutoClassName) após a atualização da normalização. Também me pergunto se devo apenas repetir a tabela um registro de cada vez, em vez de JOIN, o que parecia ridículo quando comecei isso, mas agora parece que isso teria sido mais rápido.
Como devo mudar minha metodologia para minhas atualizações de normalização restantes (semelhantes a esta) mais rapidamente?
TOP
cláusula. Essa seria a minha abordagem.