проблема производительности linq - PullRequest
2 голосов
/ 05 июля 2011

У меня полусложный запрос LINQ, который выполняется очень медленно. Я не верю, что он использует подзапросы. Я пытался использовать ведение журнала и вижу только один сгенерированный запрос. код похож на следующий:

dc.defferedloadingenabled = false
dc.objecttrackingenabled = false

dataloadoptions dlo = new dataloadoptions
dlo.loadwith<MyQuestion>(q => q.lotsofresponses)
dc.LoadOptions = dlo

IQuerayable<Question> questions = dc.questions.where( q => q.ParentId == specificID).orderBy(q => q.Rank);

foreach (question in questions)
{
}

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

Ниже приведен сгенерированный SQL. Я удалил фактические ключи и имена столбцов. Счет (*) выглядит странно для меня.

SELECT [t0].[QId], [t0].[SId], [t0].[Tp], [t0].[St], [t0].[OL], [t0].[Is], [t0].[Tbl], [t0].[IsL], [t0].[Priority], [t1].[ResponseId], [t1].[QId] AS [QId2], [t1].[UId], [t1].[AN], [t1].[AT], (
    SELECT COUNT(*)
    FROM [dbo].[Responses] AS [t2]
    WHERE [t2].[QId] = [t0].[QId]
    ) AS [value]
FROM [dbo].[Questions] AS [t0]
LEFT OUTER JOIN [dbo].[Responses] AS [t1] ON [t1].[QuestionId] = [t0].[QuestionId]
WHERE [t0].[SurveyId] = @p0
ORDER BY [t0].[Priority], [t0].[QId], [t1].[ResponseId]

1 Ответ

3 голосов
/ 05 июля 2011

Поскольку вы захватили запрос, зарегистрировав его, отнесите его в SqlStudio и изучите план выполнения.

  • Вы не должны видеть TableScan.Если вы видите это, добавьте первичный ключ в таблицу.
  • Вы не должны видеть ClusteredIndexScan в таблице LotsOfResponses.Если вы видите это, добавьте индекс в столбец внешнего ключа таблицы LotsOfResponses.
  • Вы должны увидеть ClusteredIndexSeek или IndexSeek в таблице Вопросы.Если вы этого не видите, включите Questions.ParentId в первичный ключ или добавьте к нему индекс (в зависимости от того, что наиболее подходит).

Кроме того, выполните запрос с помощью

SET STATISTICS IO ON 
SET STATISTICS TIME ON

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

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