Sto cercando di capire un problema che stiamo riscontrando con SQL Server 2000. Siamo un sito Web moderatamente transazionale e abbiamo un proc memorizzato chiamato sp_GetCurrentTransactions
che accetta un ID cliente e due date.
Ora, a seconda delle date e del cliente, questa query può restituire qualsiasi valore compreso tra zero e migliaia di righe.
Il problema: quello che abbiamo riscontrato è che improvvisamente avremo una serie di errori (in genere Execution Timeout Expired
o simili) per un particolare client mentre provano a eseguire quel proc memorizzato. Quindi esaminiamo la query, la eseguiamo in SSMS e scopriamo che ci vogliono 30 secondi. Quindi ricompiliamo il proc memorizzato e -bang- ora viene eseguito in 300ms.
Ne ho parlato con il nostro DBA. Mi ha detto che il database ha creato un piano di query quando abbiamo creato il proc memorizzato. Ha detto che era un buon piano per quel set di parametri, ma se ci lanci un certo set di parametri, allora il piano non sarà il piano migliore per quei dati, e quindi lo vedrai funzionare lentamente.
Le opzioni che mi vengono presentate sono lo spostamento di quel problema da un proc memorizzato e di nuovo in SQL dinamico che ha il suo piano di esecuzione creato ad ogni corsa.
Mi sembra un passo indietro e sento che ci deve essere un modo per aggirare questo. Esiste un altro modo per affrontare questo problema?
Tutte le risposte sono apprezzate.