Eu tive um problema semelhante com procedimentos armazenados e, para mim, acabou sendo 'sniffing de parâmetros'. Pesquise no Google e veja se resolve o seu problema, para mim foi uma aceleração dramática depois que o consertei.
No meu caso, consertei declarando uma variável local para cada parâmetro que foi passado e, em seguida, atribuí a variável local a esse valor de parâmetro, e o restante do proc usou as variáveis locais para processamento ... por qualquer motivo, isso derrotou o sniffing de parâmetros.