У меня есть запрос LINQ to SQL, который генерирует следующий SQL:
exec sp_executesql N'SELECT COUNT(*) AS [value]
FROM [dbo].[SessionVisit] AS [t0]
WHERE ([t0].[VisitedStore] = @p0) AND (NOT ([t0].[Bot] = 1)) AND
([t0].[SessionDate] > @p1)',N'@p0 int,@p1 datetime',
@p0=1,@p1='2010-02-15 01:24:00'
(Это фактический SQL, взятый из SQL Profiler на SQL Server 2008.)
План запросов, сгенерированный, когда я запускаю этот SQL из Query Analyser
, идеален.
Он использует индекс, содержащий VisitedStore
, Bot
, SessionDate
.
Запрос возвращается мгновенно.
Однако, когда я запускаю это из C # (с LINQ), используется другой план запроса, который настолько неэффективен, что даже не возвращается через 60 секунд. Этот план запроса пытается выполнить поиск ключа в кластерном первичном ключе, который содержит пару миллионов строк. У него нет шансов вернуться.
Что я просто не могу понять, так это то, что EXACT один и тот же SQL выполняется - либо из LINQ, либо из Query Analyzer, но план запроса другой.
Я выполнил два запроса много раз, и теперь они выполняются изолированно от любых других запросов. Дата - DateTime.Now.AddDays(-7)
, но я даже жестко закодировал эту дату, чтобы устранить проблемы с кэшированием.
Есть ли что-нибудь, что я могу изменить в LINQ to SQL, чтобы повлиять на план запроса или попытаться отладить это дальше? Я очень, очень смущен!