У меня есть тест этого запроса в студии управления и это выполнить очень быстро (менее чем за секунду)Почему exec sp_executesql намного медленнее, чем встроенный sql?
declare @p_Message_0 varchar(3) = 'whh'
declare @p_CreatedTime_0 datetime = '2015-06-01'
SELECT count(1) FROM (SELECT * FROM [Logs](nolock) WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t
SELECT t2.* FROM (SELECT t.*,ROW_NUMBER() OVER (ORDER BY Id DESC) as rownum FROM (SELECT * FROM [Logs](nolock) t WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t) t2 WHERE rownum>0 AND rownum<=20
план выполнения, как это:
затем переместить его в C# ADO.NET, его как это
exec sp_executesql N'SELECT count(1) FROM (SELECT * FROM [Logs](nolock) WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t
SELECT t2.* FROM (SELECT t.*,ROW_NUMBER() OVER (ORDER BY Id desc) as rownum FROM (SELECT * FROM [Logs](nolock) t WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t) t2 WHERE rownum>0 AND rownum<=20',N'@p_Message_0 varchar(3),@p_CreatedTime_0 datetime',@p_Message_0='whh',@p_CreatedTime_0='2015-06-01'
этот пробег очень медленный (около 30 секунд). план выполнения:
Я не знаю, что заставляет эти два плана отличаться. Сервер Sql - это 2008 R2 с пакетом обновления 2 (SP2), и я попробовал параметр подсказки и OPTION (RECOMPILE), оба не работают для меня.
После изменения индекса столбца datetime в CLUSTERED INDEX скорость быстро загорается, большое спасибо! – Chocoboboy
Кстати, обновление statisitcs не ускоряется, я не знаю почему. – Chocoboboy