2015-06-01 4 views
0

У меня есть тест этого запроса в студии управления и это выполнить очень быстро (менее чем за секунду)Почему 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 

план выполнения, как это: enter image description here

затем переместить его в 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 секунд). план выполнения: enter image description here

Я не знаю, что заставляет эти два плана отличаться. Сервер Sql - это 2008 R2 с пакетом обновления 2 (SP2), и я попробовал параметр подсказки и OPTION (RECOMPILE), оба не работают для меня.

ответ

1

Попробуйте обновить статистику. Первая использует переменную с сегодняшней датой. Переменные не обнюхиваются, поэтому вы получите угаданный дистрибутив. Второй использует параметр. Это можно понюхать.

Если статистика не была обновлена ​​сегодня, SQL Server будет думать, что ни одна строка не существует для этой даты, поэтому даст план на этой основе. Например, план вложенных циклов, который, как оценивается, выполняет TVF один раз, но фактически выполняет его много раз.

AKA the ascending date problem.

+0

После изменения индекса столбца datetime в CLUSTERED INDEX скорость быстро загорается, большое спасибо! – Chocoboboy

+0

Кстати, обновление statisitcs не ускоряется, я не знаю почему. – Chocoboboy