Eu herdei um aplicativo (e banco de dados MS SQL associado) que foi instalado por um fornecedor de software há muitos anos. Não temos nenhum tipo de suporte de fornecedor neste momento. Além de usar o aplicativo, também acessamos o banco de dados independentemente do aplicativo, muitas vezes fazendo atualizações no banco de dados diretamente e consultando dados para geração de relatórios.
Em um esforço para melhorar o desempenho, excluí alguns índices desnecessários e criei outros. Isso causava bugs no aplicativo ao executar determinadas tarefas. O aplicativo não exibe nenhuma mensagem de erro de qualquer tipo e parece funcionar normalmente, mas o banco de dados não é atualizado pelo aplicativo conforme o esperado. Não tenho acesso ao código fonte.
Minha teoria é que o aplicativo especifica explicitamente um índice excluído em uma instrução with(index) em uma de suas consultas. Isso faria com que o servidor retornasse um erro em vez de concluir a consulta e, se o aplicativo suprimisse o erro, o usuário não saberia que algumas tabelas foram atualizadas e outras não. Que outras ideias poderiam causar esse comportamento?
Supondo que minha teoria esteja correta, ainda acredito que o índice seja realmente desnecessário e o aplicativo nunca deveria ter especificado o índice. Talvez uma solução seja criar um novo índice com o mesmo nome, mas com a menor quantidade de colunas possível. Existe alguma maneira de criar um índice sem colunas? Criar um índice não clusterizado com as mesmas colunas do índice clusterizado seria o mais eficiente? O que o otimizador faz neste caso - ele ainda planeja incluir esses índices "ruins" que apenas fazem referência ao índice clusterizado ou saberá ignorar a solicitação with(index)?
Eu executei um rastreamento para ver quais consultas o aplicativo estava executando. Recebi várias chamadas RPC como "exec sp_cursorfetch" e "exec sp_cursorexecute" (que não entendo) em vez do SQL real. Talvez eu pergunte sobre isso em uma pergunta separada, mas se você souber como posso interpretar ou decodificar essas instruções em SQL regular, isso me permitiria pelo menos confirmar minha teoria.