#c# #mysql #asp.net #performance #entity-framework
#c# #mysql #asp.net #Производительность #entity-framework
Вопрос:
Пожалуйста, помогите мне найти способ сделать это эффективным
В программе есть следующие объекты:
Проекты 1-N модулей
, модули 1-N подмодулей.
Подмодули 1-N сегментов.
каждый сегмент имеет разный статус (по умолчанию / завершен) и количество слов
Подсчет слов производится, когда сегменты вставляются в базу данных и сохраняются в столбце.
Число просмотров. Список проектов Должно быть менее 100 проектов, поэтому для этого я перечисляю их все без включения.
Список модулей (с параметром 1 ProjectID) должен содержать столбец со словами завершено / всего и строками завершено / всего
Список подмодулей (с параметром 1 ModuleID) должен содержать столбец со словами завершено / всего и строками завершено / всего
Предположим, у меня было бы около 50 тыс. строк (сегментов) на модуль. поэтому производительность является обязательной.
Вариант 1: IQueryable дочерние объекты.Какой-то Count()
Вариант 2: добавьте столбцы статистики в таблицы в базе данных с помощью заданий CRON, чтобы обновить их или сохранить proccedure / триггеры в mysql.
Вариант 3?: Создание 2 представлений в mysql? никогда не делал их, но, возможно, они подходят для работы?
Предлагаемые варианты: пока нет
Никогда раньше не работал с такими большими наборами данных, и производительность является обязательной. Пожалуйста, посоветуйте
Комментарии:
1. Каков ваш конкретный вопрос? Пожалуйста, покажите код, который не работает.
2. Дело не в том, что это не работает, я не знаю, как правильно рассчитать такого рода статистику дочерних объектов. Это большие таблицы, и они не хотят запускать сервер каждый раз, когда я загружаю представление. Конкретный вопрос будет заключаться в следующем: как эффективно отображать завершенные слова / всего слов в представлениях
3. Почему бы не попробовать 3 варианта и измерить разницу? Обычно представление на стороне базы данных является самым быстрым.
Ответ №1:
var query = _context.Submodules.Where(t => t.Id == id)
.Select(e => new Submodules{
Id = e.Id,
Name = e.Name,
Status = e.Status,
Token = e.Token,
ModuleId = e.ModuleId,
Gender = e.Gender,
TotalRows = e.TotalRows,
TotalWords = e.TotalWords,
CompletedWords = e.Segments.Where(a => a.Status == Abr.Recorded).Sum(y=> y.Wordcount),
CompletedRows = e.Segments.Where(a => a.Status == Abr.Recorded).Count()
}).ToList();