sql server - Prevent ADO.NET from using sp_executesql -


in our sql server 2005 database (tested using management studio dbcc freeproccache , dbcc dropcleanbuffers), following statement fast (~0.2s compile time, ~0.1s execution time):

select ... ... = 1 , b = '' ... 

the following statement, however, slow (~0.2s compile time, 7-11s execution time):

exec sp_executesql n'select ... ... = @a , b = @b ...', n'@a int, @b nvarchar(4000), ...', @a=1, @b=n'', ... 

sql server chooses different execution plan, although queries equal. makes sense, since, in first case, sql server has actual values of a, b , other parameters available , can use statistics create better plan. apparently, query plan concrete values of parameters much better generic 1 , outweighs "query plan caching" performance benefit.

now question: ado.net seems use second option (sp_executesql) when executing parameterized queries, usually makes sense (query plan caching, etc.). in our case, however, kills performance. so, there way either

  • force ado.net use different sp_executesql (i.e., sql server query analyzer takes actual parameter values account) or
  • force sql server recaclulate query plan of sql passed sp_executesql taking parameter values account?

and please don't tell me have go ugly, old, dangerous sql = "where b = " + quoteandescape(parameterb)...

putting sql stored procedure makes no difference (slow, , without with recompile). did not post actual sql statment since quite complex (joins on multiple tables, including sub-selects , aggregation).

old thread know, found googling pretty exact same phrase! had same issue (query ran fast in management studio using parameters, slow via ado.net) , replicated issue running query in management studio via "exec sp_execute". 2 execution plans different, optimize query hint, instead did initial select of of data temporary table. seemed make difference, , given query complex one, might make difference in case - i'm not quite sure how worked, seemed kick execution plan line when using sp_execute.


Comments

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -