No contexto de bloqueio, as tabelas e seus índices relacionados são entidades separadas. Às vezes, o deadlock ocorre entre uma tabela e seu índice, em vez de entre duas tabelas separadas.
O problema é mais provável quando um bloqueio é adquirido em um índice e outro bloqueio é adquirido na tabela relacionada (ou seja, barra) para fazer a pesquisa de dados. Durante a inserção, isso acontecerá na ordem oposta. Primeiro, a tabela (ou seja, a barra) é bloqueada e atualizada, depois os índices são bloqueados.
select foo
from bar
where @someId = 0 OR SomeId = @someId
Você tem/pode adicionar um índice de cobertura (para ajudar com a seleção) que contém o SomeId e o foo ? Dessa forma, você evitará completamente a pesquisa e impedirá que o problema ocorra.
Você pode postar os planos de consulta em vez de quadros de deadlock?