需求
在一个 CRUD 的列表接口中,需要统计每个供应商的供货记录总数及合格率。
先上 MS SQL,当然这是豆包 AI 帮我写的:
SELECT
[Name],
COUNT(*) AS Total,
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE CAST(SUM(CASE WHEN QJudgment = '合格' THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*)
END AS QualifiedRate
FROM
[MyDB].[dbo].[SupplierRecord]
GROUP BY
[Name];
在一个大约 14 万条记录的 SQL Server 表中,执行时间大概两秒。没有索引。
多虑了
因为供应商信息存储在 MySQL 中,而供货记录着 SQL Server 中,所以一开始我担心直接在列表页接口中返回统计信息, 会导致接口响应过慢。毕竟 SQL Server 是一个三方系统的数据库,没加相关索引,也不能动。
原计划是,定期跑一边全量的统计,例如,遍历供应商表,每个供应商再去 SQL Server 去查询统计信息。 因为供应商太多,如果一条查询跑两秒,担心半天都跑不完,影响工作时间的系统性能。
但是,冷静下来想想,既然没有索引,那么横竖都是扫全表,为何不能一条 SQL 直接扫完全表并将统计完成呢?
所以,就有了上面求助 AI 生成的那条统计 SQL。
这样每次列表接口,加个 Where in 条件就可以了,2 秒还能接受,毕竟是内部系统,也没人抱怨。
微信关注我哦 👍
我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式