Problema de memória física de inserção em massa do SQL Server

3

Eu tenho um script que executa 15 operações de inserção em massa em um banco de dados do SQL Server em seqüência, todas baseadas no abaixo:

BULK INSERT M_USERS
    FROM '\spath\users.txt'
    WITH ( 
        BATCHSIZE = 1000, 
        FIELDTERMINATOR = '|', 
        ROWTERMINATOR = '\n', 
        FIRSTROW = 2,
        ERRORFILE='\spath\users.err'
    )
GO

Os 15 arquivos de texto variam em tamanho. Alguns têm menos de 5000 linhas, enquanto os maiores têm mais de 5.000.000 linhas. Estou executando o script em um servidor com 12 GB de memória e um arquivo de paginação de 24 GB. Uma vez iniciado, noto que o uso da memória física nesse servidor aumenta constantemente até quase 100%. Mesmo depois que o script é concluído (ou falha devido à falta de memória), o uso de memória nunca cai. Parece que o Sql Server nunca libera os recursos de memória usados para executar as inserções em massa.

Alguém sabe se eu poderia resolver isso revisando meu script ou se isso é um problema com o SQL Server?

Editar: Eventualmente recebo o erro "Não há memória de sistema insuficiente no pool de recursos 'interno' para executar essa consulta." e tudo falha depois disso.

    
por Michael Hornfeck 25.03.2011 / 15:18

1 resposta

5

É por design. A menos que você limpe a quantidade de memória que o SQL Server pode ter acesso, ele consumirá a maior quantidade de memória possível. Isso normalmente não é uma coisa ruim. O SQL tem seu próprio SO interno para coisas como agrupamento de threads e gerenciamento de memória e é MUITO bom nessas coisas. Adicionar muitos dados provavelmente faz com que o SQL coloque muito em seu cache de dados (entre outras coisas) que é armazenado na memória.

Se o SQL Server for a única coisa que está sendo executada na sua máquina, a regra geral é permitir que ele tenha menos de 1,5 / 2 GB de memória, reservando isso para o sistema operacional do servidor. Quanto mais memória você puder lançar no SQL Server, mais feliz será.

EDITAR para a sua edição:
Você definitivamente desejará limitar a memória que o SQL Server usará. Eu não posso dizer com certeza quantos bytes você está trabalhando, mas você provavelmente está fazendo com que seu servidor troque o SQL, o que é uma má notícia.

No Pesquisador de Objetos no SQL Server Managment Studio:

  • Clique com o botão direito na sua instância do servidor
  • Clique em Memória na lista de navegação à esquerda
  • Defina a memória máxima do servidor (em MB) para algo entre 10000 e 15000 (10-15 GB).
  • Clique em Ok

Você também pode executar isso em uma janela de consulta:

sp_configure 'max server memory (MB)',10000
GO
RECONFIGURE
GO

A memória SQL de 10000 caps a 10 GB.

    
por 25.03.2011 / 15:25