Ho avuto un problema simile con le stored procedure e per me si è rivelato essere "sniffing dei parametri". Cercalo su Google e vedi se risolve il tuo problema, per me è stato un notevole aumento di velocità una volta risolto.
Nel mio caso, l'ho risolto dichiarando una variabile locale per ogni parametro passato, quindi ho assegnato la variabile locale a quel valore di parametro, e il resto del processo ha utilizzato le variabili locali per l'elaborazione... per qualsiasi motivo, questo ha sconfitto lo sniffing dei parametri.