Мы используем довольно сложный трубопровод агрегации MongoDB в приложении Java Spring Boot с API Mongotemplate.aggregate. Трубопровод включает в себя совпадение, проект, несколько поисков, разматывания, группы, добавок и окончательного проекта. < /P>
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("isFeatureEnabled").is(true)),
project("entityId"),
lookup("relatedEvents", "entityId", "foreignEntityId", "events"),
unwind("events"),
project().and("events.referenceId").as("referenceId"),
lookup("referenceCatalog", "referenceId", "catalogId", "referenceDetails"),
unwind("referenceDetails"),
group("referenceDetails.severityLevel", "referenceDetails.category")
.count().as("eventCount"),
addFields()
.addFieldWithValue("severity",
ConditionalOperators.switchCases(
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("severityLevel").equalToValue(1)).then("LOW"),
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("severityLevel").equalToValue(2)).then("MEDIUM"),
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("severityLevel").equalToValue(3)).then("HIGH"),
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("severityLevel").equalToValue(4)).then("CRITICAL")
).defaultTo("UNKNOWN")
)
.addFieldWithValue("category",
ConditionalOperators.switchCases(
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("category").equalToValue("TypeA")).then("TYPE_A"),
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("category").equalToValue("TypeB")).then("TYPE_B"),
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("category").equalToValue("TypeC")).then("TYPE_C"),
ConditionalOperators.Switch.CaseOperator.when(ComparisonOperators.Eq.valueOf("category").equalToValue("TypeD")).then("TYPE_D")
).defaultTo("UNKNOWN")
)
.build(),
project("severity", "category", "eventCount")
);
List results = mongoTemplate
.aggregate(aggregation, "mainEntities", AggregatedResult.class)
.getMappedResults();
< /code>
Мы запускаем этот конвейер как в средах DEV, так и в средах PRD, используя один и тот же код и почти идентичные наборы данных (индексы существуют с обеих сторон). Тем не менее, время выполнения значительно отличается: < /p>
dev занимает около 2 минут < /p>
prd, который занимает около 4 минут < /p>
, что может быть причиной таких различий в производительности между Dev и Prd, несмотря на: < /p>
my ром и индексы (On intity) < /p> . Версия < /p>
Тот же конвейер агрегации < /p>
Аналогичное оборудование (насколько мы можем судить) < /p>
Существуют ли конкретные инструменты профилирования или конфигурации mongodb (например, память, диск, индексный кэш, различия в плановых плановых планах), которые мы должны искать? Любое руководство или прошлый опыт будут оценены.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... pared-to-d
Почему мой трубопровод агрегации MongoDB значительно медленнее в PRD по сравнению с DEV с аналогичными данными? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему отправка Kotlin происходит значительно медленнее по сравнению с Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 28 Просмотры
-
Последнее сообщение Anonymous
-