SQL Server - Exportar tabela grande sem chave primária

9

Eu preciso sincronizar uma tabela grande ~ 500 milhões de linhas sem uma chave primária entre o SQL Server e o MySQL. A tabela possui apenas um índice não exclusivo composto em cluster.

Eu tenho uma conexão ODBC entre os servidores, mas uma importação de ~ 8 milhões de linhas levou cerca de 45 minutos; portanto, acredito que uma importação única maior não seria razoável, pois podem ocorrer interrupções a qualquer momento. Não consigo alterar a estrutura da tabela existente, posso adicionar outras tabelas. Após uma leitura mais aprofundada, o deslocamento / busca não é uma opção para tabelas grandes. "Selecionar ... onde x entre ... e ..." não é uma opção, pois não tenho uma chave exclusiva.

Como posso exportar a tabela em lotes com garantia de conter todas as linhas? Meu problema é que, como a chave em cluster não é exclusiva, ordenar depois não garantiria que as linhas físicas tenham a mesma ordem entre consultas consecutivas e ordenar depois que todas as colunas levariam muito tempo. E como você recomendaria migrar os lotes por meio de arquivos ODBC ou CSV?

ninguém
fonte
Isso será repetido (operação usual) ou operação única?
Bogdan Bogdanov
A exportação inicial será uma operação única, as alterações de sincronização, como novos registros ou atualizações, devem ser repetitivas. O CDC não é uma opção, mas investigará mais após a migração inicial.
ninguem
Eu acho que para receber ajuda sobre isso você tem que explicar em mais detalhes todo o processo (que pareça que você tem problema muito complexo)
Bogdan Bogdanov
Você observa "como a chave em cluster não é exclusiva, fazer o pedido depois de não garantir que as linhas físicas tenham a mesma ordem entre consultas consecutivas". Como a ordem das linhas não é preservada (a menos que você tenha alguns dados de sequência), não é possível confiar na obtenção da mesma ordem de linha física. A ordem das linhas não é padrão para a ordem de inserção nem a ordem do índice, mas é definida pela cláusula ORDER BY .
RLF 29/01
Sim, RLF, eu concordo. As colunas são todas as entradas, A, B, C, D, E. A chave em cluster está no ABC. Uma combinação ABC não é única, nem uma combinação ABCD. "Ordenar por" uma coluna não exclusiva permite exportar a tabela inteira em lotes? E Bogdan Bodganov, a plataforma Stack desencoraja problemas complexos, é melhor apenas abordar a questão. Como exportar a tabela grande completa o mais rápido possível em lotes sem perda de linhas?
ninguem

Respostas:

0

Supondo que você não tenha atualizações ou exclusões na tabela de origem, tente o seguinte:
1. Faça uma cópia da tabela existente usando a sintaxe CTAS (para SQLServer é SELECT * into source_table_copy FROM source_table). Essa operação é muito rápida, mesmo para mesas enormes.
2. Adicione um after insertgatilho para source_tablecopiar novos registros para source_table_copy.
3. Agora, quando todos os novos registros source_tableentrarem source_table_copytambém, e você pode mover os dados da tabela copiada para o Mysql em lotes. Por exemplo, se você tiver um link entre 2 servidores, tudo poderá ser feito dentro do corpo do procedimento armazenado TSQL.
Por exemplo, um pedaço de código que move até 20 registros para o novo servidor pode parecer

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

Também é possível usar CURSOR para ler dados e depois excluir com a where current ofcláusula.

** Idealmente, você precisa impedir que os aplicativos insiram dados source_tabledurante a etapa 1. Se for absolutamente impossível, irei com um after insertgatilho que é adicionado logo antes da etapa 1 e removido logo após o término, que copia os dados para outra tabela que puder depois mesclar com source_table_copy.

a1ex07
fonte
Obrigado pela solução, eu estava tentando algo também, no entanto, com uma inserção normal. Vou tentar a sintaxe do CTAS para ver se isso acelera as coisas. Pergunta de acompanhamento, se você não se importa: o "gatilho após inserção" afetaria as performances?
ninguém
Como o corpo do gatilho é muito simples (basta inserir dados em outra tabela), o impacto no desempenho será mínimo.
a1ex07