From b6bd6357edbcba2d6c0d88982bbb5bf8d30d99d3 Mon Sep 17 00:00:00 2001 From: fawney19 Date: Sun, 4 Jan 2026 20:05:23 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=20GlobalModel=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E7=9A=84=20N+1=20=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/admin/models/global_models.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/api/admin/models/global_models.py b/src/api/admin/models/global_models.py index 4aa2c98..68349fa 100644 --- a/src/api/admin/models/global_models.py +++ b/src/api/admin/models/global_models.py @@ -146,20 +146,25 @@ class AdminListGlobalModelsAdapter(AdminApiAdapter): search=self.search, ) - # 为每个 GlobalModel 添加统计数据 + # 一次性查询所有 GlobalModel 的 provider_count(优化 N+1 问题) + model_ids = [gm.id for gm in models] + provider_counts = {} + if model_ids: + count_results = ( + context.db.query( + Model.global_model_id, func.count(func.distinct(Model.provider_id)) + ) + .filter(Model.global_model_id.in_(model_ids)) + .group_by(Model.global_model_id) + .all() + ) + provider_counts = {gm_id: count for gm_id, count in count_results} + + # 构建响应 model_responses = [] for gm in models: - # 统计关联的 Model 数量(去重 Provider) - provider_count = ( - context.db.query(func.count(func.distinct(Model.provider_id))) - .filter(Model.global_model_id == gm.id) - .scalar() - or 0 - ) - response = GlobalModelResponse.model_validate(gm) - response.provider_count = provider_count - # usage_count 直接从 GlobalModel 表读取,已在 model_validate 中自动映射 + response.provider_count = provider_counts.get(gm.id, 0) model_responses.append(response) return GlobalModelListResponse(