AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 16763
Accepted
spaghetticowboy
spaghetticowboy
Asked: 2012-04-20 06:06:26 +0800 CST2012-04-20 06:06:26 +0800 CST 2012-04-20 06:06:26 +0800 CST

Como executo um script grande com muitas inserções sem ficar sem memória?

  • 772

Pergunta:

Tenho um script com cerca de 45 mil inserts de comandos select. Quando tento executá-lo, recebo uma mensagem de erro informando que estou sem memória. Como posso obter este script para executar?

Contexto:

  1. Adicionados alguns novos campos de dados para fazer um aplicativo funcionar bem com outro aplicativo que o cliente usa.
  2. Obteve uma planilha de dados do cliente cheia de dados que mapeou itens de dados atuais para valores para esses novos campos.
  3. Planilha convertida para inserir declarações.
  4. Se eu executar apenas algumas das instruções, ele funcionará, mas o script inteiro não.
  5. Não. Não há erros de digitação.

Se houver uma maneira diferente de carregar esses dados, sinta-se à vontade para me punir e me informar.

sql-server sql-server-2005
  • 6 6 respostas
  • 89261 Views

6 respostas

  • Voted
  1. Best Answer
    Darin Strait
    2012-04-20T06:27:26+08:002012-04-20T06:27:26+08:00

    O tamanho máximo do lote para o SQL Server 2005 é 65.536 * Tamanho do pacote de rede (NPS), em que o NPS geralmente é 4 KB. Isso funciona para 256 MB. Isso significaria que suas instruções de inserção teriam uma média de 5,8 KB cada. Isso não parece certo, mas talvez haja espaços estranhos ou algo incomum lá.

    Minha primeira sugestão seria colocar uma instrução "GO" após cada instrução INSERT. Isso dividirá seu único lote de 45.000 instruções INSERT em 45.000 lotes separados. Isso deve ser mais fácil de digerir. Tenha cuidado, se uma dessas inserções falhar, você pode ter dificuldade em encontrar o culpado. Você pode querer se proteger com uma transação. Você pode adicionar essas instruções rapidamente se o seu editor tiver um bom recurso de pesquisa e substituição (que permitirá pesquisar e substituir caracteres de retorno como \r\n) ou um recurso de macro.

    A segunda sugestão é usar um Wizard para importar os dados direto do Excel. O assistente cria um pequeno pacote SSIS para você, nos bastidores, e o executa. Não terá esse problema.

    • 18
  2. Aaron Bertrand
    2012-04-20T06:43:34+08:002012-04-20T06:43:34+08:00

    BULK INSERTou bcpparecem opções mais apropriadas do que 45.000 instruções de inserção.

    Se você precisar ficar com as instruções de inserção, eu consideraria algumas opções:

    R: Use transações e envolva lotes de 100 ou 500 ou 1.000 instruções em cada uma para minimizar o impacto no log e no lote. por exemplo

    BEGIN TRANSACTION;
    INSERT dbo.table(a, ...) SELECT 1, ...
    INSERT dbo.table(a, ...) SELECT 2, ...
    ...
    INSERT dbo.table(a, ...) SELECT 500, ...
    COMMIT TRANSACTION;
    GO
    
    BEGIN TRANSACTION;
    INSERT dbo.table(a, ...) SELECT 1, ...
    INSERT dbo.table(a, ...) SELECT 2, ...
    ...
    INSERT dbo.table(a, ...) SELECT 500, ...
    COMMIT TRANSACTION;
    GO
    

    B: Em vez de instruções de inserção individuais, use UNION ALLpara 100 ou 500 instruções por vez, por exemplo

    INSERT dbo.table(a, ...)
    SELECT 1, ...
    UNION ALL SELECT 2, ...
    ...
    UNION ALL SELECT 500, ...
    GO
    
    INSERT dbo.table(a, ...)
    SELECT 501, ...
    UNION ALL SELECT 502, ...
    ...
    UNION ALL SELECT 1000, ...
    GO
    

    Deixei de lado o tratamento de erros por brevidade, mas o ponto é que eu nunca tentaria enviar um único lote de 45.000 instruções individuais para o SQL Server.

    • 14
  3. datagod
    2012-04-20T06:25:38+08:002012-04-20T06:25:38+08:00

    Não sei por que você está recebendo o erro de falta de memória, mas há uma abordagem mais fácil.

    Se você puder exportar os dados da planilha em um formato delimitado (por exemplo, csv), poderá usar o assistente de importação de dados no SSMS para inserir os dados para você:

    Tarefa de dados de importação do SSMS.

    • 9
  4. Hung Vu
    2017-02-07T02:57:31+08:002017-02-07T02:57:31+08:00

    Usando vários SqlBulkCopy, crie uma tabela temporária. Insira novos dados na tabela temporária e, em seguida, mescle os dados da tabela temporária com a existente. Exemplo usando o método C# SqlBulkCopy.WriteToServer (DataTable) . Espero que ajude

    • 0
  5. Kms
    2019-07-17T09:32:17+08:002019-07-17T09:32:17+08:00

    Sim, poderíamos fazer isso, tentei com uma abordagem BCP (Bulk Copy Program) para evitar um problema de OutOfMemory .

    Nota : Tentei no SQL Server 2014.

    No BCP, primeiro precisamos exportar os dados do banco de dados de origem para o arquivo bcp (na pasta do diretório local) e, em seguida, precisamos importar esse arquivo bcp para o banco de dados de destino.

    insira a descrição da imagem aqui

    Abaixo estão os passos da caminhada do bolo:

    Observação:

    a) Certifique-se de que a tabela vazia esteja presente no banco de dados de destino

    b) Certifique -se de que a pasta Temp esteja presente na unidade C

    1. Crie um arquivo bat chamado Export_Data.bat com o comando mostrado abaixo:

      bcp.exe [Source_DataBase_Name].[dbo].[TableName] OUT "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 
      

      pausa

    2. Execute esse arquivo bat, pois um arquivo bcp será gerado na pasta Temp

    3. Em seguida, crie um outro arquivo bat chamado Import_Data.bat com o seguinte comando:

      bcp.exe [Destination_DataBase_Name].[dbo].[TableName] IN "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 
      

      Pausa

    E aqui vamos nós!

    • 0
  6. Frank
    2022-02-03T10:19:54+08:002022-02-03T10:19:54+08:00

    Eu tive um problema semelhante com o SSMS anos atrás, quando eu tinha grandes INSERTs em massa para preencher uma tabela temporária a partir de dados fornecidos em um arquivo do Excel.

    Eu revisei minhas declarações para terminar com um ponto e vírgula. O problema desapareceu. Tais como:

    INSERTs com terminadores de instrução

    • -1

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve