SQL Server 2008 R2–Como resolver lentidão na conexão com Windows Authentication

Olá. Vou fugir um pouco do foco do blog que é C# e assuntos mais elementares de programação para compartilhar uma solução para um problema que tive recentemente na empresa que trabalho.

Cenário

Durante o desenvolvimento de uma aplicação com .Net Framework que usava colunas do tipo FILESTREAM do SQL Server 2008 R2, ao ler a documentação descobri que para poder fazer upload e download de conteúdo para o banco de dados – que armazena arquivos e indexa o seu conteúdo – deveria usar Windows Authentication ou não iria poder executar a tarefa.

A primeira escolha foi cadastrar um usuário do domínio como usuário do SQL Server para a Windows Authentication. Ao executar o programa na máquina de desenvolvimento, tudo foi tranquilo. Tanto o upload como o download foram rápidos e aceitáveis, mas, quando fizemos o teste em estações da rede e até mesmo usando máquinas virtuais, o resultado foi decepcionante.

Primeiramente, foi necessário usar um recurso do Windows chamado “impersonate” no qual se armazena as credenciais de um usuário e, quando for necessário, carrega-se estesas para poder conectar-se ao banco. Ao executar as operações com os arquivos chegamos a ter quase um minuto de espera pela primeira conexão.

Nem preciso dizer que isto foi inaceitável. Dentre as várias soluções, tentamos colocar o IP na string de conexão em vez do nome do servidor, verificamos configurações de rede, instalação do SQL Server e nada disto trouxe resultados.

A Solução

Para solucionar o problema, resolvi cadastrar um usuário local no servidor que não estivesse vinculado com o domínio e armazenar as suas credenciais para poder executar o impersonate.

Assim, com o usuário local (cadastrado no servidor e no SQL Server como usuário do banco), o problema resolvido e a conexão voltou a ficar rápida tanto executando localmente como nas estações de rede.

Apenas tome cuidado se no seu caso é viável fazer este tipo de cadastro de usuário. Podem haver cenários onde você precise obrigatóriamente usar as credenciais do domínio, neste caso, bem vindo à lentidão. Não encontrei (ainda) solução.

Que saber mais sobre FILESTREAM e IMPERSONATE? Veja os links:

FILESTREAM Overview: http://technet.microsoft.com/en-us/library/bb933993.aspx

WindowsIdentity.Impersonate Method: http://msdn.microsoft.com/en-us/library/w070t6ka.aspx