У меня есть запрос 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
.
Запрос возвращается мгновенно.
Однако, когда я запускаю это из С# (с LINQ), используется другой план запроса, который настолько неэффективен, что даже не возвращается через 60 секунд. Этот план запроса пытается выполнить ключевой поиск кластерного первичного ключа, который содержит пару миллионов строк. У него нет шансов вернуться.
То, что я просто не могу понять, это то, что выполняется ТОЧНЫЙ тот же SQL - либо из LINQ, либо из Query Analyzer, но план запроса отличается.
Я запускал два запроса много раз, и теперь они работают изолированно от любых других запросов. Дата DateTime.Now.AddDays(-7)
, но я даже жестко запрограммировал эту дату для устранения проблем с кешированием.
Есть ли что-нибудь, что я могу изменить в LINQ to SQL, чтобы повлиять на план запроса или попытаться отладить это дальше? Я очень смущен!