Почему этот запрос тайм-аут? - PullRequest
0 голосов
/ 28 июля 2010

У меня есть запрос L2S с несколькими объединениями, который должен вернуть 11 записей за 3 секунды.Однако время ожидания истекает через 30 секунд, если я не укажу параметр Take (я использовал Take (20), даже если он возвращает только 11 записей), и в этом случае он возвращается в ожидаемый период времени в 3 секунды с 11 записями.

Запрос выглядит следующим образом:

(from q in TransmittalDetails where q.TransmittalHeader.TransmittalEntityID == 196
      && q.TransmittalHeader.DateRangeBeginTimeID == 20100101
      && q.TransmittalHeader.ScenarioID == 2
      && q.LineItem.AccountType.AccountCategory.AccountGroup.
             AccountSummary.AccountSummaryID == 6
 select new {
q.LineItem.AccountType.AccountCategory.AccountGroup.AccountGroupID,
q.LineItem.AccountType.AccountCategory.AccountGroup.AccountGroup1
   }).Distinct()

Это генерирует некоторый SQL, который выглядит следующим образом:

DECLARE @p0 Int = 196
DECLARE @p1 Int = 20100101
DECLARE @p2 Int = 2
DECLARE @p3 Int = 6

SELECT DISTINCT [t5].[AccountGroupID], [t5].[AccountGroup] AS [AccountGroup1]
FROM [dbo].[TransmittalDetail] AS [t0]
INNER JOIN [dbo].[TransmittalHeader] AS [t1] ON [t1].[TransmittalHeaderID] = 
   [t0].[TransmittalHeaderID]
INNER JOIN [dbo].[LineItem] AS [t2] ON [t2].[LineItemID] = [t0].[LineItemID]
LEFT OUTER JOIN [dbo].[AccountType] AS [t3] ON [t3].[AccountTypeID] = 
   [t2].[AccountTypeID]
LEFT OUTER JOIN [dbo].[AccountCategory] AS [t4] ON [t4].[AccountCategoryID] = 
   [t3].[AccountCategoryID]
LEFT OUTER JOIN [dbo].[AccountGroup] AS [t5] ON [t5].[AccountGroupID] = 
   [t4].[AccountGroupID]
LEFT OUTER JOIN [dbo].[AccountSummary] AS [t6] ON [t6].[AccountSummaryID] = 
   [t5].[AccountSummaryID]
WHERE ([t1].[TransmittalEntityID] = @p0) AND ([t1].[DateRangeBeginTimeID] = @p1) 
   AND ([t1].[ScenarioID] = @p2) AND ([t6].[AccountSummaryID] = @p3)

Теперь действительно странной частью является то, что если я выполню этот SQL вManagement Studio возвращает 11 строк за 3 секунды, но генерирующий его запрос linq будет отключен через 30 секунд активности.

Задание параметра Take просто не имеет особого смысла.Я попал в какую-то ошибку?

Примечание. Время ожидания кода без параметра Take () истекает независимо от того, выполняю ли я его из своего приложения или Linqpad.Аналогично, как в приложении, так и в linqpad он работает нормально с параметром Take ().Кроме того, без отличительного он только возвращает 19 строк.

1 Ответ

1 голос
/ 28 июля 2010

Сравните план выполнения для запроса с и без .Take (top n). Вероятно, вы получили неверный план выполнения запроса в первый раз, и добавление Take просто изменило запрос, чтобы он был снова скомпилирован.

Удалите план выполнения с помощью sp_recompile или dbcc freeproccache и посмотрите, имеет ли это значение.

Вы также можете использовать профилировщик для получения дополнительной информации о стоимости запросов, планах выполнения и т. Д. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...