Проблема с подготовкой запроса .NET LINQ

#c# #mysql #performance #entity-framework #linq

#c# #mysql #Производительность #entity-framework #linq

Вопрос:

У нас возникла проблема с запросом linq. В запросе select несколько таблиц связаны с объединениями. Где фильтры записей были применены к разделу соединения.

Этот запрос выполнялся нормально и давал надлежащий результат в течение времени с последних 8 до 9 месяцев. Внезапно потребовалось около 2 минут, чтобы получить запись с тем же соединением и потреблять 99% процессора.

Этот запрос всегда используется при входе пользователя в систему, поэтому он уверен, что в прошлом он работал нормально до момента выпуска. Может ли кто-нибудь помочь, почему эта проблема возникла внезапно?

 var entityList = (from x in db.TableA
    join y in db.TableB on x.Id equals y.TableC.TableAId into g
    from d in g.DefaultIfEmpty()
    where d.EndDateTime == null amp;amp;
          (d == null || d.TableE.PersonID == personId) amp;amp;
          x.EndDateTime == null amp;amp;
          d.TableC.EndDateTime == null amp;amp;
          x.TableE.PersonID == personId
    select new
    {
        Col1 = d != null ? d.TableC.TableD.Id : 0,
        Col2 = d != null ? d.TableC.Id : 0,
    }).AsQueryable();
 

Комментарии:

1. Возможно, размер базы данных увеличился или стал фрагментированным. См.: dev.mysql.com/doc/refman/8.0/en/innodb-file-defragmenting.html

2. Это может быть миллион вещей, проблемы с индексацией, повреждение диска, скорость сети и т. Д. Боюсь, вам нужно разобраться в этом самостоятельно. Начните с извлечения выполняемого запроса и посмотрите, как он выглядит. Запустите его вручную в базе данных, там медленно? Проверьте планы выполнения и т.д. и т.п.

3. Пожалуйста, укажите SHOW CREATE TABLE сгенерированные SELECT EXPLAIN SELECT ... и приблизительный размер таблиц.

4. @jdweng — Дефрагментация не приводит к потере производительности более чем на несколько процентов.

Ответ №1:

Если эта структура превращается d == null в d = null вместо d IS NULL , это серьезный недостаток.

OR может снизить производительность. Вам действительно нужна NULL опция для d ? Какие существуют индексы?