Quão difícil é um processo para exportar um banco de dados para um arquivo simples? Deve levar segundos, minutos, horas ou dias para concluir uma exportação?
Não tenho conhecimento da estrutura do banco de dados, além do seguinte:
- Possui aproximadamente 50 itens de dados sobre cada uma das cerca de 500 mil pessoas.
- Os dados são relativamente simples. Nenhum vídeo/imagens/áudio/arquivos ou mesmo grandes pedaços de texto. São todos nomes, números e datas.
- O DB é projetado e administrado profissionalmente. É um software moderno executado em hardware moderno. As pessoas que administram isso são profissionais, não novatos/hobbyistas/amadores. Este não é um sistema antigo sendo mantido vivo com fita adesiva e chiclete.
A história completa: Fiz um pedido de liberdade de informação a uma organização governamental que regula uma profissão. Eles não querem que eu tenha os dados.
A organização é obrigada a manter um diretório de todos os licenciados que inclua informações sobre sua identidade, educação, qualificações e status de licenciamento e registros disciplinares. Nomes atuais e anteriores, números de licença, classes de licença, data de licenciamento, quando e onde receberam seu treinamento e anotações para quaisquer questões disciplinares.
A lei também exige que esse diretório seja disponibilizado ao público e também especifica que a agência pode cobrar taxas razoáveis para fornecer cópias a qualquer pessoa que o solicitar. A agência está alegando que as taxas razoáveis seriam algo como $ 25k. Alguém esperaria que levasse mais do que alguns minutos para gerar um CSV com cerca de 50 colunas e 500 mil linhas?
Qualquer um dos itens acima, dependendo de várias variáveis diferentes envolvidas:
Uma resposta exata não pode ser dada com base nas informações que você forneceu, mas vamos imaginar um cenário, com algumas suposições, para uma estimativa aproximada. Você forneceu os seguintes pontos de partida:
Vamos supor que você esteja usando o RDBMS SQL Server, com um SSD bastante típico que pode ler ~ 500 MB/s. Vamos supor também que estamos falando de uma única tabela aqui. Vamos distribuir as colunas da tabela de forma que 2/5 delas sejam o
names
tipo para o qual usaremosVARCHAR(50)
, 2/5 das colunas sejam onumbers
tipo para o qual usaremosINT
e o 1/5 restante seja odates
tipo que vamos usarDATETIME
para. Também assumiremos que asnames
colunas estão sendo totalmente usadas, para facilitar a matemática (essa é uma suposição nominal em nossa matemática aproximada geral).Portanto, somar as 50 colunas em nossa tabela para uma única linha leva a
(20 columns * 100 bytes for VARCHAR) + (20 columns * 4 bytes for INT) + (10 columns * 8 bytes for DATETIME) = 2,160 bytes total = ~2 KB
. Se multiplicarmos isso por 500.000 pessoas (assumindo 1 linha por pessoa), isso nos dá aproximadamente1,000,000 KB = 1 GB
dados para exportar.Portanto, para uma única tabela com ~ 1 GB de dados, carregar de um SSD que obtém ~ 500 MB/s, deve levar apenas alguns segundos para ler os dados do disco. Então haverá outros gargalos. Por exemplo, se a largura de banda da rede for
1 Gigabit = 125 MB/s
de mais 8 segundos ou mais, para transferir os dados entre a máquina do banco de dados e o destino do CSV. Em seguida, gravar os dados de volta em um arquivo dependerá das velocidades do disco do destino, etc.No geral, com tudo perfeito , para a quantidade de dados em nosso cenário de exemplo acima, deve levar menos de 1 minuto. Em um mundo realista, com um servidor de banco de dados ocupado, as outras variáveis entrando mais em jogo e/ou com mais dados, você pode estar olhando para algo que leva alguns minutos ou mais.