Как я могу исправить проблему производительности этого запроса linq? - PullRequest
0 голосов
/ 13 марта 2012

Приведенный ниже код C # выполняется за 3 секунды.Я также перечислил вывод SQL Profiler.Если я изменяю инструкцию, чтобы не использовать динамический SQL, она выполняется в миллисекундах.Я не могу найти хороших ресурсов для решения этой проблемы.Но мне удалось найти статью, в которой объясняется, что в динамическом SQL, поскольку анализатор не знает значения параметров, он не может оптимизировать план запроса.

public string GetIncorporation(Parcel parcel)
    {

    var result = (from c in _context.Districts
                  where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0
                  select c).ToList();

    exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    MAX([Filter1].[A1]) AS [A1]
    FROM ( SELECT 
        SUBSTRING([Extent1].[DISTRICT_CD], 0 + 1, 2) + N''00'' AS [A1]
        FROM [STAGE].[DISTRICT] AS [Extent1]
        WHERE ([Extent1].[PARCEL_ID] = @p__linq__0) AND ([Extent1].[DB_YEAR] = @p__linq__1) AND ([Extent1].[DISTRICT_CD] < N''9000'')
    )  AS [Filter1]
)  AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 int',@p__linq__0=N'0001-02-0003',@p__linq__1=2012

Iпытаюсь построить сервисный слой.Я не хочу иметь смешанную партию хранимых процедур и запросов Linq

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Вставили ли вы этот запрос в SSMS, запустили план выполнения и посмотрите, предлагает ли он какие-либо отсутствующие индексы?

Кроме того, если вам не нужны все столбцы из таблицы, ограничьте их с помощьювыбор:

var result = (from c in _context.Districts
                  where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0
                  select c.Parcel_ID).ToList();

или

var result = (from c in _context.Districts
                  where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0
                  select new { c.Parcel_ID, c.column2, c.column3}).ToList();
0 голосов
/ 14 марта 2012

Ваша проблема с производительностью находится в разделе «Сравнить».Эта функция не может быть преобразована в обычный SQL, поэтому платформа Entity сначала материализует все объекты, соответствующие первым двум условиям (извлекается с помощью чистого SQL).После этого (который, как вы можете видеть, требуется некоторое время), третье условие сопоставляется в памяти.Избегайте метода CompareTo в вашем запросе linq, и ваши проблемы исчезнут.

0 голосов
/ 13 марта 2012

LINQ выглядит нормально, у вас есть правильные индексы?

В вставленном вами запросе из SSMS он не накладывает никаких ограничений на DISTRICT_CD, поэтому убедитесь, что он действительно выполняется.

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