Did you try it without the 'EXEC' ?
We had a similiar issue, where a query would complete in 2 seconds in SSMS and take more than 90 seconds when called from a .NET client (we wrote several VB/C# apps/sites to test it.)
We suspected that the query plan would be different, and rewrote the query with explicit looping ("inner loop join" and "with index") hints. This solved the problem.
This is almost certainly due to an 'incorrect' cached query plan. This has come up on SO quite a few times.
Due you have up-to-date statistics? A regular scheduled index maintenance plan?
You can test if it is definitely due to the cached query plan by adding this to your stored procedure definition:
CREATE PROCEDURE usp_MyProcedure WITH RECOMPILE...
This will re-index an entire database (caution if database is very large!):
exec sp_msforeachtable "dbcc dbreindex('?')"
SO posts:
Big difference in execution time of stored proc between Managment Studio and TableAdapter.
Parameter Sniffing (or Spoofing) in SQL Server
Another thing that can be important is the SET
options that are enabled. Some of these options change the query plan sufficiently to change the profile. Some can have a huge impact if you are looking at (for example) a calculated + persisted (and possibly indexed) column: if the SET
options aren't compatible, it can be forced to re-calculate the values, rather than using the indexed value - which can change an index seek into a table scan + calculation.
Try using the profiler to see what SET
options are "in play", and see if using those options changes things.
Another impact is the connection string; for example, if you enable MARS that can change the behaviour in subtle ways.
Finally, transactions (implicit (TransactionScope
) or explicit) can have a huge impact, depending on the isolation level.