Consultas SQL simples não concluídas [fechado]

8

Ainda não sei como formular a pergunta porque ainda não sabemos muito, mas gostaria de perguntar mais cedo ou mais tarde, porque isso parece algo que não deve ser negligenciado.

Esta semana, começamos a ter problemas com nosso servidor de banco de dados. Parece ser um problema de consistência de dados e se manifesta por tempos limite, mesmo em consultas muito simples e em pequenas tabelas. "Corrigimos" o problema reiniciando o servidor no início desta semana e ele desapareceu, mas agora parece que ele está voltando e desta vez em tabelas mais cruciais. Por exemplo, acabei de fazer uma investigação e estou olhando para uma consulta como esta:

SELECT * FROM table WHERE id = 1234

para um ID específico. A tabela possui mais de 30 milhões de linhas. Mas parece que isso acontece apenas para uma pequena fração dos registros. Aposto que quando eu reiniciar o servidor ou o backup e restaurar o banco de dados em outro servidor, tudo ficará bem. Mas eu vou tentar.

Neste ponto, estou executando:

DBCC CHECKTABLE ('table', NOINDEX)

mas parece que vai durar para sempre. Quando resolvemos os problemas pela primeira vez, verifiquei a tabela incorreta e estava tudo bem. Essa nova tabela é muito maior.

Algumas informações técnicas de base:

  • SQL Server 2008 R2, Windows Server 2008 R2
  • AWS / EC2, m2.2xlarge, 32 GB de RAM, 4 x 1 TB de RAID 0
  • quase sem E / S de disco, parece que a maior parte do db está na memória
  • tamanho total do db: 100GB

Os volumes ELB são "novos". Nós os criamos esta semana.

Editar: Acabei de usar o seguinte comando:

SELECT
    sqltext.TEXT,
    req.session_id,
    req.blocking_session_id,
    req.wait_type,
    req.wait_time,
    req.last_wait_type,
    req.wait_resource,
    req.open_transaction_count,
    req.transaction_id,
    req.total_elapsed_time
FROM
    sys.dm_exec_requests req
CROSS APPLY
    sys.dm_exec_sql_text(req.sql_handle) AS sqltext

e constatei que minha consulta está aguardando um bloqueio compartilhado (LCK_M_S) onde a sessão de bloqueio está aguardando outro bloqueio compartilhado bloqueado por uma sessão que não existe.

Editar 2: OK, a sessão existe (eu a encontrei usando sys.dm_exec_sessions), mas parece não fazer nada agora.

Edit 3: Não consigo encontrar nada de interessante sobre a sessão. Vejo de que servidor Web ele vem, mas não muito mais.

Edit 4: Edit 4: Encontramos um possível bug em nosso código: uma função que não estava garantindo que uma conexão com o banco de dados fosse fechada. Por outro lado, parecia que a transação que a função estava usando costumava ser descartada corretamente; nesse caso, todos os bloqueios deveriam ter sido limpos. Ainda não está muito claro para mim, mas parece ser o motivo provável. Nós vamos consertar o bug e ficar de olho nele.

Jan Zich
fonte

Respostas:

4

Para mim, esse problema foi causado por uma conexão de banco de dados deixada aberta pelo Visual Studio pausada no modo de depuração. Parar o processo de depuração permitiu que a consulta fosse concluída imediatamente.

Lunster
fonte
2

Qual é o tipo de espera para a consulta quando ela é interrompida? Isso informará exatamente o que está esperando. Vá encontrar e instalar sp_whoisactive no servidor e execute o procedimento armazenado quando tiver o problema. Isso mostrará o spid e o tipo de espera.

As chances são de que você está sendo bloqueado por alguém que está escrevendo nessa linha ou em outra linha da página ou está esperando o disco responder.

Mrdenny
fonte
0

Tente executar DBCC CHECKDBo banco de dados com problema e aguarde até que ele termine. Se houver uma inconsistência de dados físicos que produz um comportamento tão estranho, é muito perigoso trabalhar com esse banco de dados, pois você poderá perder todos os seus dados.

  1. Faça o backup o mais rápido possível.
  2. Verifique o banco de dados.

MAS

Se a tabela tiver colunas BLOB com quantidades relativamente grandes de dados, é absolutamente normal que as verificações nessa tabela levem muito tempo.

Oleg Dok
fonte
0

não tenho certeza do que você espera como resposta, mas se a tabela tiver mais de 30 milhões de linhas, é esperado que o comando DBCC seja executado por um longo tempo.

Quando voce diz:

Mas parece que isso acontece apenas para uma pequena fração dos registros

quer dizer que está preocupado que a tabela inteira não esteja sendo examinada? Isso é normal se você tiver um índice no ID, o índice será verificado, o que resultará em menos leituras.

Diego
fonte