From ff580f4367e2dc0778829bdf8b29619454c28992 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Fri, 6 Nov 2026 05:53:53 +0800 Subject: [PATCH] perf: build alert channel trees with indexed union branches --- internal/data/business/alert_metrics.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/data/business/alert_metrics.go b/internal/data/business/alert_metrics.go index d2f6e03..f6767a3 100644 --- a/internal/data/business/alert_metrics.go +++ b/internal/data/business/alert_metrics.go @@ -10,8 +10,16 @@ import ( ) func alertTree(db *gorm.DB, roots []business.ChannelKey) *gorm.DB { - return db.Table("tab_promote root").Joins("JOIN tab_promote p ON p.source_db=root.source_db AND (p.id=root.id OR p.parent_id=root.id OR p.top_promote_id=root.id)"). - Where("(root.source_db,root.id) IN ?", channelPairs(roots)) + base := func() *gorm.DB { + return db.Table("tab_promote r").Where("(r.source_db,r.id) IN ?", channelPairs(roots)) + } + self := base().Select("r.source_db,r.id,r.id AS leaf_id") + children := base().Joins("JOIN tab_promote child ON child.source_db=r.source_db AND child.parent_id=r.id").Select("r.source_db,r.id,child.id AS leaf_id") + descendants := base().Joins("JOIN tab_promote child ON child.source_db=r.source_db AND child.top_promote_id=r.id").Select("r.source_db,r.id,child.id AS leaf_id") + // Each branch can use its own equality index. UNION removes channels reached + // through both parent and top-level relationships without an OR join scan. + return db.Table("(? UNION ? UNION ?) root", self, children, descendants). + Joins("JOIN tab_promote p ON p.source_db=root.source_db AND p.id=root.leaf_id") } func alertMetricSpec(db *gorm.DB, metric int) (table, stamp, condition, amount string) { if metric == 2 {