2012-06-21 3 views
0

Я обнаружил интересную проблему, когда хранимая процедура выполняется очень медленно из Entity Framework. Я уже решил проблему, но мне хотелось бы услышать, может ли кто-нибудь сказать мне, почему решение работает.Сохраненная процедура медленная от Entity Framework из-за параметра даты

Выпуск

У меня есть хранимая процедура GetLoginCount, который принимает @date параметра типа DATETIME. Когда я выполняю эту хранимую процедуру непосредственно в базе данных, она выполняется в течение секунды. При выполнении через мое приложение через Entity Framework он занимает около 45 секунд.

Я попытался использовать WITH RECOMPILE в Хранимой процедуре и очистил планы выполнения на сервере, чтобы убедиться, что она не кэшировала некую медленную версию плана выполнения, которая не использовала правильный индекс.

Перенесемся через 2 дня экспериментов, я обнаружил, что если я просто поместите в начале моей хранимой процедуры: DECLARE @date1 DATETIME = @date и использование @ date1 вместо хранимых процедур выполняет в 1 секунду, а также от Entity Framework ,

ПОЧЕМУ?

Я решил свою проблему, и все это хорошо и хорошо, но мне нужно знать , почему это конкретное решение работает.

+0

Можете ли вы подтвердить эффективность, если вы попытаетесь использовать буквальное datetime, а не использовать переменную или параметр вообще? Если это слишком медленно (возможно, потребуется обновить статистику) (http://sqlinthewild.co.za/index.php/2011/03/22/statistics-row-estimations-and-the-ascending-date-column/) –

+0

Да, если я жестко кодирую дату в своей хранимой процедуре вместо использования @date, она выполняется быстро. –

+0

И вы тестировали с тем же литеральным значением, которое вы передавали в качестве параметра после того, как план был очищен? Присвоение переменной и использование переменной отключает параметр sniffing. то есть SQL Server больше не имеет определенной даты, которую он может найти в статистике, чтобы получить оценки избирательности и просто догадки в соответствии с «ОПТИМИЗАЦИЯ ДЛЯ НЕИЗВЕСТНОГО» –

ответ

0

Мартин Смит дал правильный ответ на комментарий, но так как он не поставил его в качестве ответа, я вставив его здесь, так что я правильно можно отметить вопрос ответил:

«Присваивание переменные и с помощью переменного отключает прослушивание параметров, т. е SQL Server больше не имеет конкретную дату можно посмотреть в статистике, чтобы получить оценки избирательности и просто угадывает согласно ОПТИМИЗАЦИИ дЛЯ UNKNOWN»

использования оптимизировать неведомый в самом деле решает проблему.