#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
? Какие существуют индексы?