本文是当前调查草稿,目标是让研发、DBA和测试能回答三个问题:某条慢 SQL 服务什么业务、为什么扫描多、先改什么风险最低。文档只记录已经从 DAS 页面或当前代码确认的事实;无法由 SQL 指纹确定的 HTTP 入口会明确写成“业务族/待确认”。

1. 调查范围与证据边界

项目当前事实
实例pc-bp10571p5q761191s
DAS 时间窗口2026-09-02 07:40:00~13:40:00(北京时间)
慢 SQL 执行次数55,344
慢 SQL 模板数686
推荐优化 SQL 执行次数/模板数54,937 / 685
页面明细上限“推荐优化 SQL”明细最多展示 200 条,不能用 200 条代替 686 个模板
2026-09-02 旧窗口可靠读取范围第一页前 50 条;第二页曾出现分页状态变化但表格内容未刷新,51~200 条没有作为旧窗口事实
当前页面快照(页面显示窗口 2026-09-02 07:40~13:40)52,256 次、672 个模板;count > 200 的 61 条已在第 3.2 节单独列出
生产操作未执行 DDL、UPDATE、DELETE、KILL 或配置修改

上一轮 55,344/686 的读数和本次页面 52,256/672 的读数是两个独立快照,不能混成一张排名表。当前页面已经可以读取第 1 页和第 2 页前 11 条的具体 SQL;但本文仍不能写成覆盖 672 个模板的全部明细。

1.1 这份清单如何使用

上一轮“当前剩余所有慢查询”读数为 686 个模板;本次页面读数为 672 个模板。DAS 明细最多展示 200 条,本稿对本次快照只逐条保留执行次数大于 200 的 61 条。每一行的“代码入口”只在代码确实出现对应表/字段/方法时填写;没有当前仓库实现的,明确标记为待确认。

1.2 当前页面复核(第二块屏幕)

本次重新打开的是 DAS 的“查询治理”页面,不是旧的“慢日志分析”页。页面显示时间范围为 2026-09-02 07:40:00~13:40:00(北京时间),统计为 52,256 次慢 SQL、672 个模板;每页设置为 50 条,共 4 页。按执行次数从高到低读取,执行次数大于 200 的模板共 61 条:第 1 页 50 条,加第 2 页前 11 条(第 2 页第 12 条已为 200 以下)。第 3 页最高约 91 次,因此不属于本次清单。

第二块屏幕的现场截图为 /tmp/das-second-screen-check.png,截图中可见第 2 页底部记录的次数为 109~91,证明分页和排序状态已经切换到当前 DAS 页面。随后已从页面 DOM 读取第 1 页 50 条和第 2 页前 11 条的 SQL 单元格;其中第 1 页第 7 条的单元格自身在 16,158 个字符处以 ... 结束,不能从页面声称已取到完整原文。

口径提醒:本节的 52,256/672/61 属于当前页面显示窗口 2026-09-02 07:40~13:40;上一轮 55,344/686 属于历史快照,不能直接混成一张排名表。SQL 中出现的 2026-09-03 是业务查询参数日期,不等于 DAS 慢 SQL 统计窗口日期。

2. 先看结论:哪些最适合先做

2.1 建议优先级

优先级SQL 族难度原因第一阶段动作
P0价格变更日志批量读取(13)低~中过滤条件稳定、返回批次固定,结果不参与金额计算明确列、确认联合索引,比较 EXPLAIN 和批次结果
P0报价基础数据/订单 COUNT(40、48)低~中主要是列表和总数查询,容易做小范围回归去掉不需要的列,确认分页是否真的需要精确 COUNT
P1成本价(5)中已有按商品和货位取最新值的稳定业务语义,候选重写明确用 MAX(id)/最新记录方案替代 COUNT+全量排序,逐商品货位比对
P1商品条码(11、16、43)中扫码接口频繁,但 JOIN、分组和手工选品语义不能混淆按入口拆 SQL;先验证条码、物料编码、手选商品三种结果
P1最近销售价(2)中“最新”是时间语义,且要排除活动价保留 activityId=0 口径,使用时间+主键确定最新记录
P1应收/付款聚合(1、3、4、8、17、22、25、27、28、30、49)高涉及收款、退款、折让、撤销和客户授信,错误会直接影响金额先做结果集对比和调用次数压缩,再决定 SQL/汇总表改造
P1销售/采购单列表、详情和 COUNT中~高多条 SQL 共用同一大表,COUNT 与列表重复,复杂 JOIN 会放大中间结果先拆主单与付款/扩展信息,分页改为按需查询,避免一次改全部页面
P2机器人 ID 范围读取(31、42、44、47)高慢点主要是一次搬运过多记录,单靠索引无法减少返回数据游标分页、字段投影、时间范围和异步统计;先确认是否允许改变报表接口
P2t_sale_order/detail 和订单号 LIKE(14、15、34、45)高SQL 来源不在当前 DGJ2 代码主链路内,且可能是 SAAS 或其他服务先定位实际仓库/服务和调用量,再做索引或接口改造

2.2 最重要的判断

平均耗时高不等于缺一个索引。当前数据中同时存在三种问题:

  1. 中间结果过大:最终只返回 1~几百行,但付款派生表、复杂 JOIN 先扫描和聚合几十万到几百万行。
  2. 业务确实返回很多行:应收、成本价、机器人会话等查询的返回行本身就很大,必须减少传输或改成汇总/分页。
  3. 调用模型重复:COUNT 和列表各查一次;一个页面循环多次查同一客户或同一批商品;这些问题不能只靠 SQL 改写解决。

3. 第一页前 50 条分类总表

K 为 DAS 页面显示的千行单位。SQL 文本可能被页面截断,下面使用已识别的表、字段和业务特征,不补写页面没有提供的完整条件。
排名业务族/表特征次数最大/平均耗时(s)最大/平均扫描行难度代码入口或证据状态
1客户应收聚合:销售单 + 付款按 stlId570610.098 / 1.602308.63K / 30.54K高ContactModel::receivableBalance()
2最近销售价,大批量 IN220216.388 / 2.409111.11K / 15.88K中SaInvoiceInfoModel::getRecentSalePrice();线上版本待核对
3销售单列表 + 付款聚合213549.049 / 4.5801.05M / 505.94K高InvSaModel::querySaleInvoice()
4付款汇总18186.604 / 1.865529.49K / 157.43K高ReportModel::splitContact2() / getpAmount()
5成本价批量查询16223.712 / 1.366656.81K / 222.16K中CostPriceModel::getCostPrices()
6销售单列表160319.937 / 5.551592.33K / 100.89K中~高InvSaModel::querySaleInvoice()
7销售单详情复杂 JOIN159042.969 / 3.2351.54M / 503.98K高InvSaModel::querySaleInvoice()
8按日期销售单 + 付款1195115.221 / 3.3571.54M / 615.27K高销售报表/对账单业务族
9采购发票汇总11333.459 / 1.411170.43K / 38.74K中ReportModel 采购汇总方法,具体 SQL 需按页面完整文本确认
10销售单 COUNT 包装查询111818.056 / 3.697197.84K / 48.48K中InvSaService 列表分页入口
11商品条码查询10611.950 / 1.110329.53K / 307.93K中Data_model_app::getPdaSkusByBarcode()
12销售订单 + 明细 IN85214.136 / 2.791117.33K / 21.44K中~高销售订单业务族,当前仓库未找到对应主表实现
13价格变更日志8413.118 / 1.8311.25M / 914.28K低~中QuotePriceChangeLogModel::getBatchUpdateList()
14t_sale_order ID 范围全量读取8196.915 / 2.263231.64K / 231.57K高当前 DGJ2 未找到调用,需定位兄弟服务
15t_sale_order_detail ID 范围全量读取81043.134 / 2.643231.64K / 231.57K高当前 DGJ2 未找到调用,需定位兄弟服务
16商品条码 COUNT/模糊查询7872.129 / 1.257206.29K / 164.89K中PDA 扫码/条码业务族
17销售单 COUNT + 付款聚合75816.352 / 2.326825.35K / 461.60K高InvSaModel/销售列表业务族
18商品多字段 LIKE72210.023 / 3.5254.19M / 4.12M中~高商品搜索业务族,需按入口确认是否可改搜索引擎
19采购订单全列查询7135.226 / 1.432140.02K / 82.96K中PoOrderInfoModel/采购订单列表
20销售单复杂 COUNT70885.082 / 3.0941.21M / 560.26K高InvSaService 分页 COUNT
21采购订单复杂 JOIN69566.770 / 5.6732.30M / 655.31K高PoOrderInfoSer/采购报表业务族
22销售单 + 付款68115.859 / 2.202825.39K / 487.83K高销售单列表或详情业务族
23销售单复杂 JOIN + LIKE66634.242 / 3.1313.15M / 614.86K高销售单检索业务族
24销售单详情 + 付款65726.210 / 2.8511.32M / 445.20K高InvSaModel::querySaleInvoiceStatement() 等
25对账单关联统计64917.941 / 4.451429.97K / 160K高InvSaModel::querySaleInvoiceStatement()
26采购订单复杂 JOIN62928.404 / 4.8692.30M / 699.06K高PoOrderInfoSer/采购报表业务族
27对账单关联统计61420.282 / 4.0462.75M / 445.39K高对账单/采购报表业务族
28销售单 COUNT + 付款57832.009 / 5.295764.17K / 548.84K高InvSaService 分页和支付状态筛选
29销售单详情 COUNT55949.261 / 3.0671.54M / 447.83K高销售单详情/列表业务族
30销售单 + 付款55029.809 / 4.590764.21K / 568.05K高InvSaModel 业务族
31机器人会话 status 查询51618.659 / 1.1171.14M / 1.12M高RobotStat / ConversationModel
32销售单复杂 JOIN45951.333 / 3.0651.54M / 489.99K高InvSaModel::querySaleInvoice()
33采购发票复杂 JOIN45818.850 / 3.073687.67K / 227.63K高采购发票报表业务族
34销售订单号 LIKE40961.943 / 30.9919.31M / 8.06M高当前 DGJ2 未找到对应表实现
35销售单 COUNT36550.159 / 2.7241.54M / 457.40K高InvSaService 分页 COUNT
36采购发票复杂 JOIN34219.977 / 3.0491.36M / 257.55K高采购发票报表业务族
37库存汇总3418.357 / 3.306113.82K / 34.29K中库存/报表业务族,具体表需凭完整 SQL 确认
38采购订单 COUNT3238.153 / 1.772818.95K / 137.81K中采购订单列表分页
39销售单复杂 JOIN32247.033 / 2.8861.54M / 483.50K高InvSaModel 业务族
40报价基础数据查询3181.634 / 1.124557.53K / 482.50K低~中QuoteGoodsBaseModel/报价任务
41调拨申请查询3081.641 / 1.1221.71M / 1.71M中StfApplyModel::getPageList()
42机器人会话 ID 范围读取297627.678 / 4.664113.45K / 112.11K高RobotStat 批处理/统计业务族
43商品条码查询2922.015 / 1.103329.53K / 326.69K中Data_model_app::getPdaSkusByBarcode()
44机器人会话记录 ID 范围读取28854.801 / 43.560970.39K / 959.94K高RobotStat/会话记录批处理
45订单查询27028.094 / 23.4384.34M / 3.76M高当前 DGJ2 未找到明确入口
46账户流水汇总2666.593 / 2.071377.17K / 112.81K中Data_model::get_account_info()
47机器人历史会话读取2613.569 / 1.36446.79K / 46.79K中~高ConversationModel/RobotStat
48报价订单 COUNT25918.861 / 4.402224.60K / 55.41K中报价订单分页业务族
49客户应收复杂聚合25763.770 / 10.549962.79K / 540.81K高ContactModel/ReportModel 应收业务族
50采购订单多字段 LIKE2534.528 / 1.781337.28K / 128.71K中~高PoOrderInfoModel/采购订单检索

3.1 前 50 条逐条说明

下表中的“SQL 特征”来自 DAS 当前能读取到的模板摘要;DAS 页面会截断过长 SQL,因此没有把缺失的条件补写成完整 SQL。代码入口是已经在当前仓库或 www/saas 兄弟仓库中找到的入口;标记“待确认”的条目不能直接安排代码修改。
排名SQL 特征对应的使用场景 / 入口为什么慢可执行的第一步难度、风险
1客户授信、销售开单/出库查询客户应收;ReceiptService::getCustomerAccount() → ContactModel::receivableBalance()最终只要客户余额,却把销售单和付款历史做大范围聚合先筛同一 sid + buId 的销售单 ID,再只聚合这些 ID 的付款高;金额口径错误会影响授信
2销售下单、报价、导入时取最近成交价;SaInvoiceInfoModel::getRecentSalePrice()大 IN 列表与“每个商品最新一条”同时计算,可能产生临时表去重商品 ID、收敛列,并用业务时间+主键确定唯一最新记录中;不能误把活动价当普通价
3销售单列表/详情同时展示付款信息;InvSaModel::querySaleInvoice()先对付款表按 stlId 全量分组,再连接当前页面少量销售单先取当前页销售单 ID,再按 ID 批量查付款高;付款状态和退款口径必须不变
4客户余额、收付款报表;ReportModel::splitContact2() / getpAmount()客户集合很小,但付款派生表可能先扫整个分表将客户/销售单集合下推到付款聚合中高;期初、退款和折让要逐客户核对
5销售、盘点、调拨取指定商品/货位成本价;CostPriceModel::getCostPrices()历史成本记录多,批量商品会放大日期过滤、排序和分组按 (invId, locationId) 取满足日期条件的最新主键,再回表取价格中;日期和版本条件不能丢
6出库/销售单列表;InvSaModel 销售单查询主表结果集大,列表查询还可能叠加排序和 COUNT先按主表过滤条件取当前页主键,再查页面列中~高;分页顺序必须一致
7销售单详情展示客户、员工、门店、来源订单和付款;querySaleInvoice()SELECT * 加多张扩展表,付款派生表先聚合,放大中间结果主单详情先查一行,扩展表与付款按该 ID 批量补齐高;必须逐字段验收
8按日期销售单、收款和对账报表;销售报表/对账单业务族时间窗口较大,主单和付款两侧都可能扫描历史分表同时在主单和付款侧保留日期边界,并先限制客户/单据集合高;跨日、时区和退货容易出错
9采购发票/采购付款汇总;ReportModel 采购报表方法客户、采购单、付款多层 JOIN/GROUP BY,汇总前数据量大先按客户和期间聚合主单,再按单据 ID 聚合付款中~高;采购退货和负数金额要核对
10销售单列表的总数查询;InvSaService::outBoundList()同一筛选条件先 COUNT、再查列表,扫描集合重复页面只需判断下一页时改为 limit + 1;必须显示页数时短缓存中;总页数展示可能变化
11PDA 扫码通过条码/物料编码找商品;Data_model_app::getPdaSkusByBarcode()商品表左连接条码表后再分组、拼接,条码表数据量大条码输入走精确驱动查询,物料编码走独立分支,并确认索引中;重复条码和返回排序不能改变
12销售订单及明细批量筛选;当前 DGJ2 未找到主表实现,需核对 www/saas大量订单/明细 ID 参与 JOIN 或 IN,扫描和返回都可能偏大先确认实际服务和参数,再按订单主键分页/批量关联明细中~高;不能在 DGJ2 误改兄弟服务
13报价价格变更任务批量读取;QuotePriceChangeLogModel::getBatchUpdateList() → QuoteManagerBaseSer状态、日期、版本过滤后仍读取过多列,且批次边界不稳定明确投影、固定主键排序,按主键游标每批读取低~中;失败重跑和状态幂等要保留
14SAAS 销售订单按 ID 范围读取;www/saas 的订单仓储ID 范围本身过宽,结果接近扫描量,索引不能减少业务需要返回的数据时间/主键游标、字段投影、限制单批范围高;需先确认导出/统计是否必须全量
15SAAS 销售订单明细按 ID 范围读取;www/saas 的明细仓储明细返回量大,主单与明细可能被重复读取先获取订单集合,再按订单 ID 分页读取必要明细高;明细顺序和完整性必须不变
16PDA 条码 COUNT 或模糊条码查询COUNT 与实际扫码查询重复扫描,模糊条件可能无法使用索引区分精确条码、物料编码和 COUNT 入口,确认是否真的需要 COUNT中;无匹配和重复数据要覆盖
17销售单列表按付款状态筛选;销售单 COUNT + 付款聚合COUNT 和付款聚合都可能先扫大集合,且各查一次先取满足主单筛选的当前页/候选 ID,再查付款状态高;付款状态边界不能改变
18商品名称、编码等多字段搜索;商品搜索业务族前置 %keyword% 使普通 B-tree 索引失效,扫描和返回都大先确认搜索语义,评估前缀索引/搜索服务,避免无条件全表 LIKE中~高;搜索结果排序和召回不能悄悄改变
19采购订单列表展示明细;PoOrderInfoModel::getPageList()列表全列读取,可能把商品名称搜索和订单扩展 JOIN 混在一起先查当前页订单主键和页面所需列,再补明细中;不能减少页面实际需要的字段
20销售列表复杂总数 COUNT;InvSaService 分页入口COUNT 复用了详情 JOIN,造成无意义的扩展表扫描COUNT 只保留影响筛选的主表/必要 EXISTS 条件高;权限、客户和状态条件必须完整
21采购订单复杂列表/详情 JOIN;PoOrderInfoSer一页数据触发多张扩展表和聚合,临时结果放大主订单先分页,扩展信息按当前页 ID 批量取高;采购金额和状态字段要逐项比对
22销售单列表附带付款金额付款派生表无当前页 ID 边界,反复按 stlId 分组当前页主单 ID 驱动付款查询并按 stlId 返回一行高;收款、退款和折让口径风险高
23销售单检索同时带模糊条件和复杂 JOIN模糊筛选先造成大候选集,再被多表 JOIN 放大先在主表得到候选主键,确认数量后再补 JOIN高;可能影响模糊召回和排序
24销售单详情/对账单附带付款详情只需少量单据,却触发全量付款聚合单据 ID 驱动付款和扩展查询高;必须做金额和空值对比
25客户对账单关联统计;querySaleInvoiceStatement()单据、付款、客户多层汇总,日期和客户条件下推不足先固定对账单单据集合,再聚合付款/折让高;对账结果属于财务口径
26采购订单复杂 JOIN与第 21 条同类,列表/详情扩展 JOIN 先于分页或聚合主单分页 + 扩展批量查询,保留所有筛选条件高;需要按页面逐字段回归
27对账单/采购报表关联统计多表汇总和 GROUP BY 形成大中间表以客户、期间、单据 ID 为边界拆分聚合高;期初与退货不能遗漏
28销售单 COUNT + 付款同时承担总数和付款状态筛选,重复扫描主单和付款先查候选主键,再分别完成 COUNT/付款汇总高;列表数量与状态要保持一致
29销售单详情 COUNT详情条件被用于 COUNT,且可能带无关 JOIN将 COUNT 收敛到真正影响过滤的主表条件高;权限过滤不能丢
30销售单 + 付款与第 22 条同类,付款聚合范围大于页面需要页面单据集合下推到付款侧高;需旧新结果集一致
31机器人统计按 status 查会话;RobotStat / ConversationModel状态选择性不足,历史会话表扫描接近全量增加统计页面实际需要的时间/站点边界,必要时分页高;统计口径和会话完整性风险
32销售单复杂 JOIN多张客户、员工、门店、来源表叠加,SELECT * 放大返回主单 ID 分页后按关系键批量加载扩展高;需确认所有页面字段
33采购发票复杂 JOIN发票、采购单、付款/客户扩展 JOIN 后再汇总先按发票/客户聚合,再补展示字段高;金额、退货、核销要对账
34销售订单号 LIKE;入口待从 www/saas 实际调用确认订单号模糊搜索扫描数百万行,平均耗时高先确认是否允许前缀/精确搜索,再设计规范化字段或搜索索引高;改变召回范围需产品确认
35销售单 COUNT列表分页前重复计算总数评估 limit + 1、短缓存或独立轻量 COUNT高;页数语义和权限条件必须一致
36采购发票复杂 JOIN与第 33 条同类,采购报表聚合范围过大先限制期间/客户/发票集合,再连接扩展表高;必须核对采购报表金额
37库存汇总;具体 SQL/表待凭完整 DAS 文本确认库存按商品、仓库或货位汇总,可能扫宽日期/仓库范围明确页面筛选边界和汇总粒度,再做覆盖索引或快照中;当前不能仅按“库存汇总”改 SQL
38采购订单列表 COUNT;PoOrderInfoModelCOUNT 与列表查询重复,且采购筛选可能包含模糊条件不需要精确页数时用 limit + 1,否则保留轻量 COUNT中;页数和权限口径要回归
39销售单复杂 JOIN与第 7/32 条同类,扩展 JOIN 在大集合上执行当前页主键驱动扩展和付款查询高;详情字段不能缺失
40报价基础数据查询;QuoteGoodsBaseModel / 报价任务报价基础数据读取范围较宽,返回字段可能超过任务需要只取任务需要的列,按服务站/版本/商品集合收敛低~中;需保证报价规则和版本兼容
41调拨申请列表;StfApplyModel::getPageList()apply_sid OR deliver_sid、关键词 LIKE 和 COUNT 叠加按角色拆成可用索引的分支,最后按申请单主键去重中;同一申请单命中两侧时不能重复
42机器人会话按 ID 范围批处理最大耗时和返回量都很大,本质是批量搬运过多数据主键游标、固定批量、字段投影;页面查询与导出任务分离高;不能破坏会话顺序和导出完整性
43商品条码查询;Data_model_app::getPdaSkusByBarcode()与第 11 条同类,条码表 JOIN/分组扫描多条码精确分支单独走索引,物料编码单独处理中;重复条码、排序、无匹配需比对
44机器人会话记录按 ID 范围读取会话记录本身数量大,平均扫描/返回接近百万行按会话 ID/时间游标读取必要列,禁止页面先读全量再截断高;首条消息、顺序和关联会话不能改变
45订单查询;当前 DGJ2 未找到明确入口平均耗时和扫描量都高,可能是订单号/明细宽范围搜索先确认实际服务、完整 SQL 和调用页面,再决定索引或搜索方案高;暂不能在 DGJ2 直接修改
46账户流水汇总;Data_model::get_account_info()客户、分类、账户、付款多表关联并汇总,历史流水多先按站点/客户/期间限制流水集合,再补展示关联中;账务金额必须按客户和期间核对
47机器人历史会话读取;ConversationModel / RobotStat历史数据读取边界较宽,页面可能只需要最近一页增加时间/站点边界和分页,投影页面所需字段中~高;统计口径和历史兼容要回归
48报价订单 COUNT;报价订单分页业务族COUNT 与报价订单列表重复,且筛选条件可能复杂评估 limit + 1 或短缓存,必要时保留轻量 COUNT中;总数变化需产品接受
49客户应收复杂聚合;ContactModel / ReportModel销售单、付款和折让大范围汇总,金额计算不能只看总行数固定客户/单据集合后分别聚合销售、付款、折让,逐客户比对高;必须覆盖撤销、销退、超收、负数金额
50采购订单多字段 LIKE;采购订单检索多字段模糊搜索导致索引失效,候选行多后再做 JOIN先确认搜索字段和召回要求,评估前缀/搜索索引和分页中~高;不能未经确认改变搜索结果

3.2 当前页面快照:执行次数大于 200 的 61 条

本节是当前页面的独立快照,不与上一轮 55,344/686 的历史读数混排。DAS 页面显示时间范围为 2026-09-02 07:40:00~13:40:00;页面显示 52,256 次慢 SQL、672 个模板;每页 50 条、共 4 页。按执行次数降序读取第 1 页 50 条和第 2 页前 11 条,第 61 条为 201 次,第 62 条已降为 178 次,因此本表的筛选边界为 count > 200,共 61 条。

下面的表只负责展示 61 条的指标和定位,不把它冒充成 SQL 原文。每条原文单独放在第 3.5 节;超长 IN 参数在共享文档中脱敏折叠。指标含义为“最大/平均耗时(秒)”“最大/平均扫描行”“最大/平均返回行”。

排名SQL 指纹(已脱敏归一化)次数最大/平均耗时最大/平均扫描行最大/平均返回行
1销售单 + 付款按 stlId 聚合,计算客户 rePayment538410.597 / 1.627308.72K / 31.02K1 / 1
2销售明细按 invId 取最大 id,关联销售单状态201117.840 / 2.612205.11K / 17.95K359 / 50
3付款表按客户、类型、日期汇总 amount/diffAmount18946.929 / 1.866529.70K / 157.38K1.17K / 374
4销售单按日期查询,左连接付款聚合172030.711 / 3.5841.32M / 525.33K159 / 8
5销售单列表,关联客户和门店,第一页 50 条161120.364 / 5.252592.57K / 92.31K300 / 50
6销售单详情,多客户/员工/账户/门店/来源单及付款 JOIN159882.392 / 3.3681.54M / 509.11K1 / 1
7成本价按商品、货位取最新 id15553.724 / 1.364656.83K / 223.44K139.96K / 26.07K
8采购发票按客户、类型、日期汇总10803.629 / 1.471170.43K / 39.97K9 / 0
9销售单条件 COUNT,派生表只返回数量99016.292 / 3.703198.03K / 49.79K1 / 1
10销售单列表 + 付款聚合,返回 50 条98071.301 / 2.9211.54M / 555.25K881 / 26
11销售订单关联明细,按商品 IN 取订单 ID86014.878 / 2.809117.51K / 21.53K1.93K / 100
12销售单列表 COUNT,关联客户/付款/门店84430.800 / 7.871765.40K / 682.51K1 / 1
13销售单列表,关联客户/付款/门店,返回页面数据82130.741 / 6.416765.30K / 695.86K118 / 16
14t_sale_order_detail 按连续 ID 范围全量读取8198.591 / 2.600231.87K / 231.80K231.87K / 231.80K
15t_sale_order 按连续 ID 范围全量读取8197.879 / 2.322231.87K / 231.80K231.87K / 231.80K
16采购订单明细按 sid 查询来源订单行7946.018 / 1.426148.01K / 82.97K7.87K / 1.58K
17商品条码查询的 COUNT 包装查询7121.820 / 1.251167.76K / 164.81K1 / 1
18采购订单复杂 COUNT:订单、商品、出库、入库、关闭69541.216 / 5.4042.30M / 651.50K1 / 1
19商品条码/物料编码查询,分组返回商品66010.233 / 3.5594.19M / 4.09M10 / 2
20采购订单复杂列表,计算锁定/出库/入库/关闭数量62141.652 / 4.9562.30M / 699.72K100 / 14
21商品条码精确查询,GROUP_CONCAT 条码6041.671 / 1.081329.53K / 165.37K3 / 1
22销售单详情 COUNT,多客户/付款/员工/账户 JOIN58445.025 / 3.1751.40M / 439.02K1 / 1
23对账单按客户去重 COUNT58318.356 / 4.293458.10K / 168.13K1 / 1
24对账单筛选客户 ID,关联结算单明细53921.463 / 3.9322.68M / 430.87K100 / 76
25销售单详情/列表,付款和多张基础表 JOIN51424.722 / 2.9001.40M / 464.21K75 / 13
26采购发票 COUNT,付款/出库/发票明细 JOIN50321.866 / 3.151755.81K / 258.65K1 / 1
27机器人会话按 status 查询全表49719.079 / 1.1361.13M / 1.12M3.53K / 2.28K
28报价基础表按批次更新价格(UPDATE ... JOIN)4891.973 / 1.146558.58K / 426.08K0 / 0
29销售单详情 COUNT,多客户/付款/员工/账户 JOIN46156.010 / 2.8851.40M / 488.76K1 / 1
30销售单详情/列表,复杂 JOIN,返回几十行42852.119 / 2.8644.12M / 510.30K42 / 3
31销售单与付款状态/客户信息查询42028.526 / 3.3971.32M / 443.93K4.50K / 197
32采购发票列表,客户/付款/出库信息 JOIN38822.294 / 2.934926.78K / 293.05K100 / 35
33销售单详情 COUNT,多客户/付款/员工/账户 JOIN38469.512 / 2.8411.10M / 474.65K1 / 1
34销售订单按订单号/描述模糊检索,返回订单字段38063.238 / 31.6319.31M / 8.03M1 / 1
35客户应收报表:销售单金额、付款、折让按客户聚合36824.008 / 8.217408.13K / 190.66K258 / 97
36销售单列表 COUNT,关联客户/付款/门店35510.964 / 2.047825.28K / 360.65K1 / 1
37销售单列表,关联客户/付款/门店34357.660 / 2.6741.10M / 504.29K100 / 20
38商品条码 COUNT 包装查询3371.877 / 1.256165.45K / 164.80K1 / 1
39调拨申请列表,申请方/发货方 OR + 单号搜索3201.544 / 1.1181.71M / 1.71M20 / 20
40报价基础表检查结算价为零的记录3162.020 / 1.116557.58K / 472.05K0 / 0
41客户应收排行榜,深度分页并计算余额30562.213 / 11.6041.02M / 542.16K1 / 1
42商品条码/物料编码查询,分组返回商品3029.384 / 3.5884.19M / 4.18M20 / 2
43库存按商品和日期汇总30211.647 / 3.281191.12K / 35.36K500 / 119
44机器人会话按连续 ID 范围全量读取2885.287 / 2.612113.28K / 112.08K113.28K / 112.08K
45机器人会话记录按连续 ID 范围全量读取28851.375 / 42.390935.48K / 925.30K935.48K / 925.30K
46销售单按状态/日期筛选并校验付款是否结清27510.856 / 2.117968.74K / 395.89K2 / 1
47销售单列表 + 付款聚合 + 客户/门店27511.426 / 2.030825.33K / 389.58K139 / 21
48机器人历史会话按连续 ID 范围全量读取2734.415 / 1.43750.45K / 50.45K50.45K / 50.45K
49采购订单复杂 COUNT,重复计算出库/入库/关闭2723.830 / 1.662818.95K / 107.57K1 / 1
50客户应收列表,余额计算后按余额深度分页26460.999 / 11.8461.02M / 591.80K10 / 8
51销售明细报表,成本价/商品/客户/仓库/员工 JOIN26222.860 / 2.5893.51M / 657.61K1 / 1
52报价订单 COUNT,关联客户和商品26119.916 / 4.403224.74K / 55.78K1 / 1
53商品条码精确查询2561.531 / 1.089329.71K / 325.05K4 / 2
54账户流水按账户汇总历史付款2554.370 / 1.910286.62K / 101.21K70 / 12
55采购订单多字段 LIKE 检索单号2494.581 / 1.845384.37K / 136.90K3.14K / 100
56收款明细 + 付款历史派生表,按销售单查询24161.674 / 2.7171.39M / 500.51K1 / 1
57销售明细报表,按商品分类过滤并计算成本23622.931 / 2.5913.51M / 697.02K533 / 40
58销售订单 COUNT,订单号/描述模糊查询23637.254 / 9.640356.68K / 129.24K1 / 1
59收款明细 + 付款历史派生表,按销售单查询21927.382 / 2.3611.39M / 528.25K105 / 6
60报价基础表与商品表比对指导价/结算价2132.082 / 1.45114.53K / 11.76K10 / 9
61维修站按地域和用户关联 COUNT2012.955 / 1.948753.62K / 753.09K1 / 1

3.3 当前 61 条逐条场景、入口和处理建议

下表把“SQL 指纹”映射到实际业务。能在 DGJ2 或兄弟仓库找到代码的,列出文件和方法;只有 SQL 指纹而没有当前仓库入口的,明确标为“待确认”,不得直接开修改分支。验收统一要求:同一参数、同一数据快照下,先比旧/新结果,再比 EXPLAIN、扫描行、临时表和 P95/P99。

排名使用场景 / 代码入口慢因与优化建议难度 / 风险 / 验收重点
1销售开单/出库查询客户授信;ReceiptService::getCustomerAccount() → ContactModel::receivableBalance()付款先按整个分表 stlId 分组,最后只返回一个余额。先筛客户销售单 ID,再聚合付款;保留原 PHP 金额口径。高 / 金额错误会影响授信 / 逐销售单和客户总额对比,覆盖退款、折让、超收、负数和撤销。
2销售价、报价、导入取最近成交价;SaInvoiceInfoModel::getRecentSalePrice()、SaOrderInfoModel::getRecentSalePrice()大 IN + 每商品最新记录。商品 ID 去重,明确时间/主键取最新,保留活动价排除。中 / 活动价或最新记录口径变化 / 逐 invId 比来源行和价格。
3客户/收付款报表期初汇总;ReportModel::splitContact2()客户集合已知但付款表先大范围聚合;将客户集合和业务类型下推,删除调用方不用的非聚合列。高 / 期初、负数和账务口径 / 按客户、期间、类型核对金额。
4销售报表或对账单按日期查询;InvSaModel 销售报表族主单和付款派生表都可能扫描历史。保留双方日期边界,先锁定单据集合再聚合付款。高 / 跨日、时区、退货 / 固定单据集结果一致。
5出库列表第一页;InvSaModel::querySaleInvoice()SELECT *、客户/门店 JOIN 和排序同时执行。先按主表条件取当前页 ID,再补扩展字段。中高 / 分页顺序和字段 / 第1页、中间页、末页对比。
6销售单详情展示客户、收款、员工、账户、门店、来源单;querySaleInvoice()详情只有一行,却先聚合大付款表,多表 JOIN 放大中间结果。按详情单据 ID查询付款和扩展。高 / 详情字段和付款状态 / 页面字段逐项比对。
7出库、盘点、调拨取最新成本价;CostPriceModel::getCostPrices()历史成本记录多,批量商品使最新记录分组变大。按商品/货位取 MAX(id) 后回表取价格,保留日期/版本条件。中 / 日期语义 / 逐商品货位对比价格和空值。
8采购发票/付款期初汇总;ReportModel 采购报表方法采购单据按客户、类型、日期汇总;先限制客户和期间,再做金额聚合。中高 / 采购退货和负数 / 与原报表逐客户核对。
9销售列表分页总数;InvSaService::outBoundList()COUNT 使用派生表,可能扫描与列表相同的大集合。只需下一页时用 limit + 1;必须总页数时短缓存。中 / 页数显示变化 / 总数、权限和状态条件一致。
10销售列表附带付款;InvSaModel::querySaleInvoice()付款派生表无当前页边界。主表先分页,付款只查当前页 ID。高 / 付款状态缺失 / 旧新页面字段和金额一致。
11SAAS/移动销售搜索按 SKU 取订单;www/saas 的 SaleOrderRepository::search()主表左连明细,商品 IN 与分页同时处理。确认真实参数后按明细索引筛订单,再主键分页。中高 / 重复订单和分页 / 订单集合、排序、总数一致。
12销售列表 COUNT;销售单分页入口COUNT 包含客户、付款、门店 JOIN。COUNT 只保留会影响筛选的主表/EXISTS 条件。高 / 权限和付款筛选 / COUNT 与实际列表一致。
13销售列表;InvSaModel与 12 同族,列表阶段重复聚合付款。按当前页单据 ID 批量补付款。高 / 列表字段 / 固定页面参数逐字段比对。
14SAAS 销售订单批处理;兄弟仓库 t_sale_order_detailID 区间几乎全量返回,索引不能减少业务必须搬运的行。改主键游标、固定批量、字段投影或异步导出。高 / 明细完整性 / 记录数、顺序、关联订单不变。
15SAAS 销售订单批处理;兄弟仓库 t_sale_order同 14,主表区间查询本质是大批量搬运。先确认调用方是否真的需要历史全量。高 / 不能误改兄弟服务 / 以实际服务部署版本回归。
16采购订单来源订单查询;PoOrderInfoModel::getPageList() 业务族来源订单明细集合较大,SELECT * 增加传输。只取调用方字段并按主键/来源单分页。中 / 订单关联 / 返回字段和顺序一致。
17PDA 条码 COUNT;Data_model_app::getPdaSkusByBarcode()COUNT 包装了商品/条码分组查询。扫码精确查询和 COUNT 分支分离,确认条码索引。中 / 重复条码 / 单条码、多条码、无匹配对比。
18采购订单列表分页 COUNT;PoOrderInfoModel / PoOrderInfoSer出库、入库、关闭三个派生聚合被重复计算。主订单先筛选,再按当前页订单/商品批量计算。高 / 待入库数量口径 / 订单、赠品、退货和关闭数量一致。
19PDA 条码/物料编码查询;getPdaSkusByBarcode()条码表与商品表先 JOIN、分组,导致百万级扫描。条码和物料编码走独立精确分支,保留拼接和排序。中 / 返回契约 / 条码集合、主商品字段、排序一致。
20采购订单列表;PoOrderInfoModel同 18,列表返回不大但中间 JOIN 很大。按当前页主键补充出入库/关闭汇总。高 / 采购数量和状态 / 固定页面逐行对比。
21PDA 精确条码查询;getPdaSkusByBarcode()扫描量较高,GROUP_CONCAT(DISTINCT ...) 可能放大分组。先查命中 item,再补商品和全部条码。中 / 重复条码及排序 / 五类条码用例回归。
22销售详情分页 COUNT;InvSaModel为 COUNT 执行详情级多表 JOIN 和付款聚合。去除不参与过滤的投影和 JOIN。高 / 详情筛选边界 / COUNT 与页面结果一致。
23客户对账单总数;querySaleInvoiceStatement()结算单明细先连接再 COUNT(DISTINCT buId)。先筛时间/客户/单据,再做去重。高 / 对账单归属 / 客户集合和总数一致。
24对账单按客户筛选;querySaleInvoiceStatement()结算明细和销售单连接范围较大。用存在性筛选当前客户集合,避免先返回宽中间表。高 / 一单多明细 / 按客户和单据集合核对。
25销售单详情/列表;InvSaModel::querySaleInvoice()复杂 JOIN 和付款聚合无页面边界。主表分页、扩展批量化、明确列。高 / 字段遗漏风险 / 页面完整快照对比。
26采购发票分页 COUNT;采购报表业务族COUNT 复用了采购发票详情 JOIN。仅保留影响条件的发票/客户/状态表。高 / 采购金额与状态 / COUNT 和明细列表一致。
27机器人统计按状态;RobotStat / ConversationModelstatus 选择性不足,查询接近全表。增加时间、服务站和分页边界,必要时统计快照。高 / 统计口径 / 总数、时间边界和会话状态一致。
28报价指导价批次更新;QuoteGoodsBase 任务这是写操作,不是普通查询;批次 JOIN 仍需扫描基础表。批次表按 base_id/sid/inv_id 驱动,保留 compare-and-set。高 / 误更新报价 / 预发验证更新数、保护规则、幂等和 MQ。
29销售单详情 COUNT;销售列表分页同 22,复杂详情 SQL 被用于总数。拆轻量 COUNT 与页面数据查询。高 / 权限/状态条件 / COUNT 结果和页面记录一致。
30销售单详情/列表;InvSaModel扫描 4M 行但返回很少,典型是扩展 JOIN 和付款派生表无边界。按主单 ID 驱动。高 / 详情和付款 / 固定参数逐字段和金额对比。
31销售单付款状态/客户信息;销售列表/报表族主单结果不大,但付款和客户聚合先做大范围扫描。把 buId/stlId 集合下推。高 / 付款状态 / 结清、部分付款、撤销用例。
32采购发票列表;采购报表族采购发票、客户、付款和出库信息中间结果较大。先分页发票主键,再补扩展。高 / 采购金额 / 发票、退货、核销逐项对账。
33销售详情 COUNT;InvSaModel详情投影全部参与派生表,COUNT 却只要 1 个数。下沉过滤,删无关 JOIN。高 / 过滤语义 / 与旧 COUNT 集合做差集。
34销售订单号/描述搜索;具体调用待从部署服务确认%关键词% 使普通索引失效,平均扫描约 8M 行。先确认能否改前缀/精确搜索,再评估专用搜索字段。高 / 召回范围改变 / 关键词、特殊字符、无结果和分页回归。
35客户应收报表;ReportModel::splitContact2()客户级金额聚合仍在销售单/付款大集合上执行。客户集合下推,按客户汇总后再 JOIN 联系人。高 / 财务金额 / 客户和期间旧新总额一致。
36销售列表 COUNT;InvSaService 分页COUNT 与列表重复扫描,且可能带客户/付款/门店 JOIN。改轻量 COUNT 或短缓存。中高 / 页数语义 / 分页、权限和状态一致。
37销售列表;InvSaModel复杂 JOIN 的扫描远大于返回量。当前页主键驱动扩展查询。高 / 列表字段 / 分页顺序、字段、付款一致。
38PDA 条码 COUNT;条码业务族COUNT 与实际扫码查询分别扫描条码表。按输入类型分支,必要时仅 COUNT 命中 item。中 / 重复条码 / COUNT 与实际商品行数口径一致。
39调拨申请列表;StfApplyModel::getPageList()apply_sid OR deliver_sid 使索引利用受限,且可能拼接 LIKE '%%'。按角色拆分分支后按申请单 ID 去重。中 / 同单双角色会重复 / 交集、关键词、分页对比。
40报价基础数据结算价检查;报价任务/QuoteGoodsBaseModel时间窗口和多分表条件下仍扫描较多行。按版本/时间索引和只取 sid 评估。低中 / 不能漏掉异常服务站 / 异常集合和后续修复批次一致。
41客户应收排行榜;ReportModel / ContactModel 应收业务族先完整计算所有客户余额,再按余额深度分页,LIMIT 490 不能减少前置聚合。改汇总表或缓存余额,不能直接改排序口径。高 / 金额和排名 / 总额、排名、翻页稳定性一致。
42PDA 条码/物料编码查询;getPdaSkusByBarcode()与 19 同类,扫描 4M 行但返回 20 行。拆精确路径、校验条码表索引和商品 sid 条件。中 / 结果契约 / 输入类型和重复数据回归。
43库存报表按商品/日期汇总;库存业务族时间范围和大 invId IN 组合导致扫描较大。先限制商品集合,再按库存主键/日期汇总。中高 / 期初和增减 / 商品、仓库、日期边界对账。
44机器人会话历史批处理;RobotStat连续 ID 范围几乎全量返回。改时间/主键游标和字段投影,页面与导出分离。高 / 会话完整性 / 记录数、顺序、状态一致。
45机器人会话记录批处理;RobotStatV2 / ConversationRecordModel平均返回接近 93 万行,数据库和 PHP 传输都成为瓶颈。固定批量、游标、只取必要列。高 / 首条消息、顺序、关联会话 / 导出结果完整对比。
46销售单按状态判断是否已结清;销售报表族付款派生表无销售单 ID 边界,表达式过滤不能提前使用索引。先筛销售单,再按 ID 聚合付款。高 / 结清判定 / 已结清、部分、撤销和日期边界。
47销售出库列表;InvSaModel同 10,付款聚合和客户/门店扩展范围大于页面 50/139 条。按当前页 ID 批量加载。高 / 页面付款值 / 逐行字段和金额对比。
48机器人历史会话查询;ConversationModelID 范围查询返回全部历史记录。用游标/时间分页,明确页面是否需要全部字段。中高 / 历史顺序 / 同范围集合和顺序一致。
49采购订单待处理数量 COUNT;PoOrderInfoModel出库、入库、关闭派生表重复计算,COUNT 只需要是否有记录。先候选订单再按订单键聚合。高 / 待处理数量 / 采购状态和数量逐单对比。
50客户欠款排名深度分页;ReportModel / 应收业务族先计算全部客户余额再排序,深翻页只是最后一步。中长期应收汇总表;短期仅做客户集合和缓存治理。高 / 授信和排名 / 余额、排序和翻页一致。
51销售明细报表按商品分类;InvSaModel::querySaleInvoiceInfoStatement() 业务族明细聚合、成本价最新记录、商品/客户/仓库/员工 JOIN 叠加。先聚合明细,再按结果集合补维度。高 / 成本和金额 / 商品、货位、分类、成本逐项对账。
52报价订单分页 COUNT;OfferOrderInfoModel / 报价订单服务COUNT 带客户和商品 JOIN。拆轻量 COUNT,列表只补当前页商品信息。中 / 报价过滤 / 总数、商品和客户字段一致。
53商品条码精确查询;PDA 入口返回很少但扫描多,说明条码/商品连接未充分利用输入条件。条码表精确命中后回表。中 / 条码重复 / 单条码、物料码、无匹配回归。
54账户流水历史汇总;Data_model::get_account_info()按账户汇总历史流水,缺少站点/期间或前置账户集合限制。先按站点/账户/期间缩小集合,再汇总。中高 / 账务金额 / 账户、日期和收支类型核对。
55采购订单多字段搜索;PoOrderInfoModelSKU、商品名、来源单号、采购单号多列 %LIKE%,索引难以生效。评估前缀/专用检索字段。中高 / 召回范围 / 关键词、权限和分页回归。
56收款明细页面;付款明细和付款派生聚合只查看某张收款单,却先聚合整个付款分表。先按 iid/stlId 查当前单,再补聚合;保留状态条件。高 / 收款金额 / 收款、退款、折让和撤销逐笔核对。
57销售明细分类报表;querySaleInvoiceInfoStatement()成本价和明细聚合重复扫描大集合。先按日期、分类、单据筛明细,再按商品/货位取成本。高 / 报表金额 / 商品、数量、成本和分类合计一致。
58销售订单 COUNT;销售订单查询入口待确认订单号/描述 %LIKE% 扫描较大,COUNT 与列表重复。优先精确/前缀分支和轻量 COUNT。高 / 搜索召回 / 精确订单号、描述关键词和无结果。
59收款明细页面;付款明细和派生聚合与 56 同族,返回少但派生付款表扫描多。以当前收款/销售单 ID 驱动付款查询。高 / 财务明细 / 逐行付款、折让和状态一致。
60指导价/结算价一致性巡检;QuoteGoodsBase 任务这是巡检统计,返回少,主要扫描候选商品集合。按 sid + inv_id、更新时间和版本缩小范围,保留 guide_plan_id 分支。中 / 不能覆盖区域计划价 / 差异数量与明细集合一致。
61维修站地域筛选和用户关联;kxj_repair_depot 业务,当前 DGJ2 入口待确认用户关系子查询先去重,地域过滤后仍扫描约 75 万行。先确认归属服务和索引,再评估 (province,city,area,status,id) 与关系表驱动。中 / 可能属于外部系统 / 先核对部署仓库、COUNT 和权限边界。

3.3.1 61 条 SQL 的接口、脚本、页面入口定位矩阵

这一节回答“这条慢 SQL 到底从哪里发起”。第 3.5 节 按排名保存了 SQL 结构;本节不重复整段 SQL,而是用表名、关键字段和 SQL 族做唯一定位。页面/View 是打开功能页面的入口,前端 JS/请求关键词是从浏览器 Network 找到请求源头的最短路径,Controller → Service → Model 是后端实际调用链。

证据级别必须这样理解:

  • 已确认:当前代码中同时找到了 SQL 对应的方法和明确的接口、页面或任务入口。
  • 业务族已确认:已经找到同一 Model/Service 或同一表族的多个调用方,但 DAS SQL 被归一化、截断或被多个场景复用,不能诚实地指定唯一页面。
  • 待确认:当前 DGJ2 没有对应实现,或 SQL 属于 www/saas/外部服务,必须拿部署版本、完整 SQL 或请求日志继续确认。

#1~#20

排名 / SQL 定位接口或脚本Controller → Service → Model页面 / View前端 JS、请求关键词或任务入口证据级别
1 t_scm_sa_invoice_* + t_scm_payment_info_*,rePayment/index.php/scm/receipt/getCustomerAccountscm/Receipt::getCustomerAccount → ReceiptService::getCustomerAccount → ReceiptService::getCreditByBuId → ContactModel::receivableBalance销售开单:application/views/scm/invSa/salesOrder.php;同一客户授信也可能在出库/报价页展示public/js/page/sales/salesOrder.js:3308;offerGoodsSearch.js:592;moveHistoryInventory.js:3112;Network 搜索 getCustomerAccount已确认
2 t_scm_sa_invoice_info_*,按 invId 取 MAX(id)销售价/报价/出库商品查询 API,具体 URL 随调用方变化InventoryService::getRecentSalePrice[_new] → SaInvoiceInfoModel::getRecentSalePrice;调用方包括 InvSaService、SaOrderSer、SaleOutGoodsService、MoveMallGoodsSer、MoveStoSer、GetGoods销售开单、出库列表、报价商品、移动商城/导入页面搜索 PHP getRecentSalePrice,再在 Network 搜索商品明细加载请求;不能只凭这条 SQL 指定一个页面业务族已确认
3 t_scm_payment_info_* 按客户/类型/日期汇总/index.php/report/fundBalance_detail;供应商侧 /index.php/report/supplierBalance_detailReport::fundBalance_detail 或 Report::supplierBalance_detail → ReportService::get_fundBalance_detail / get_supplierBalance_detail → ReportModel::splitContact2客户资金明细 report/account-proceeds-detail-new;供应商对账 report/suppliers-reconciliation-newaccountProceedsDetail.js、accountProceedsDetailNew.js、suppliersReconciliationNew.js;搜索 fundBalance_detail、supplierBalance_detail业务族已确认;线上版本待核对
4 t_scm_sa_invoice_* 按日期 + 付款派生表销售报表、客户对账及资金明细接口,完整 SQL 参数才能唯一归属ReportService/InvSaService → ReportModel 或 InvSaModel 的销售单/付款查询方法销售报表、客户对账、资金明细页面Network 搜索 fundBalance_detail、customerBalance_detail、salesDetail_detail,再看 Initiator业务族已确认
5 销售单列表 + 客户/门店 JOIN,分页 50/index.php/scm/invSa/outBoundList;部分销售列表使用 getSalesOrderListNewInvSa → InvSaService → InvSaModel::querySaleInvoiceapplication/views/scm/invSa/deliveryList.php、salesOrderList.php搜索 outBoundList、getSalesOrderListNew;前端常在 public/js/page/sales已确认
6 销售单详情,多基础表 + 付款/index.php/scm/invSa?action=SaleDetail&id=...InvSa 详情动作 → InvSaService → InvSaModel::querySaleInvoice / 详情拼装方法application/views/scm/invSa/salesOrder.php 或销售详情 ViewNetwork 搜索 SaleDetail、querySaleInvoice;从详情页的 Request URL 反查 id已确认
7 成本价按商品/货位取最新记录销售、出库、调拨、盘点和报表的商品成本价接口InvSaService、SaOrderSer、CostService、InvTfService、InvOiService → CostPriceModel::getCostPrices销售开单、出库、调拨、盘点、库存/销售报表搜索 PHP getCostPrices;页面侧用 Network 搜索 cost、price 或对应业务接口业务族已确认
8 采购发票按客户/类型/日期汇总/index.php/report/fundBalance_detail、supplierBalance_detail 等采购报表接口ReportService → ReportModel::splitContact2 或采购报表方法report/pu-detail-new、new-pu-detail-new、pu-summary-new、suppliers-reconciliation-new搜索 pu_detail_new、puDetail_detail、supplierBalance_detail;采购字段通过 Request Payload 确认业务族已确认
9 销售单条件 COUNT/index.php/scm/invSa/outBoundList 的分页请求InvSa → InvSaService::outBoundList → InvSaModel COUNT 分支application/views/scm/invSa/deliveryList.phpNetwork 搜索 outBoundList,同一次请求对比 count 与列表调用;代码重点 InvSaService.php:341-345已确认
10 销售列表 + 付款聚合,返回当前页/index.php/scm/invSa/outBoundList 或销售订单列表接口InvSa → InvSaService → InvSaModel::querySaleInvoice出库列表、销售单列表搜索 outBoundList、getSalesOrderListNew;在 Network 查看分页参数和付款字段已确认
11 销售订单关联明细,商品 INSAAS 销售订单搜索接口,具体路由由 www/saas 服务提供SearchService / OrderService → SaleOrderRepository::search → t_sale_order + t_sale_order_detailSAAS 销售订单搜索页;不属于当前 DGJ2 View在 www/saas 搜索 SaleOrderRepository、search、getPageList;Network 搜索 SKU/商品筛选请求业务族已确认;兄弟仓库
12 销售列表 COUNT,带客户/付款/门店/index.php/scm/invSa/outBoundList 或同族分页接口InvSa → InvSaService → InvSaModel COUNT 查询出库列表 / 销售列表Network 搜索 outBoundList;区分同一请求中的 COUNT 与明细 SQL已确认
13 销售列表明细,带客户/付款/门店/index.php/scm/invSa/outBoundList、salesReturnListNew 等InvSa → InvSaService → InvSaModel::querySaleInvoice出库列表、销售退货列表搜索 outBoundList、salesReturnListNew;查看 Initiator 定位对应 JS已确认
14 t_sale_order_detail 连续 ID 全量读取SAAS 批处理/同步接口,路由需按部署服务确认OrderService / SearchService → SaleOrderRepository → t_sale_order_detail无固定 DGJ2 页面,主要是批处理或同步www/saas/app/Service/Sale/OrderService.php;从任务日志搜索 ID 区间或 getPageList业务族已确认;兄弟仓库
15 t_sale_order 连续 ID 全量读取SAAS 批处理/同步接口,路由需按部署服务确认OrderService / SearchService → SaleOrderRepository → t_sale_order无固定 DGJ2 页面www/saas/app/Model/Repository/Sale/SaleOrderRepository.php;搜索 SaleOrderRepository、id 区间业务族已确认;兄弟仓库
16 采购订单明细 + 来源订单行/index.php/po/purchaseOrder/infopo/PurchaseOrder → PoOrderInfoSer → PoOrderInfoModel::getPageList采购订单列表/详情 View搜索 purchaseOrder/info、getPageList;前端查看采购订单详情请求已确认
17 商品条码查询 COUNT 包装PDA 商品查询接口;具体 URL 随 App/页面路由变化TakeStockSer::getScanData 或商品扫码服务 → Data_model_app::getPdaSkusByBarcodePDA 盘点扫码、PDA 商品选择搜索 getPdaSkusByBarcode、getScanData、barcode;移动端抓请求参数 barcode业务族已确认
18 采购订单复杂 COUNT/index.php/po/purchaseOrder/info 的分页 COUNT 分支PurchaseOrder → PoOrderInfoSer → PoOrderInfoModel::getPageList采购订单列表搜索 purchaseOrder/info;对照 COUNT 和列表的相同筛选条件已确认
19 商品条码/物料编码分组查询PDA/移动商品查询接口TakeStockSer → Data_model_app::getPdaSkusByBarcodePDA 扫码、商品选择、移动端商品搜索搜索 getPdaSkusByBarcode、barcode、itemCode;查看请求是条码还是物料编码分支已确认
20 采购订单复杂列表,计算出入库/关闭数量/index.php/po/purchaseOrder/infoPurchaseOrder → PoOrderInfoSer → PoOrderInfoModel 订单列表及派生数量方法采购订单列表/详情搜索 purchaseOrder/info、getPageList;Network 看订单分页和数量字段已确认

#21~#40

排名 / SQL 定位接口或脚本Controller → Service → Model页面 / View前端 JS、请求关键词或任务入口证据级别
21 条码精确查询 + GROUP_CONCATPDA 条码查询接口TakeStockSer → Data_model_app::getPdaSkusByBarcodePDA 盘点扫码/商品选择搜索 getPdaSkusByBarcode、GROUP_CONCAT、barcode已确认
22 销售详情 COUNT/index.php/scm/invSa/outBoundList 或销售详情分页接口InvSa → InvSaService → InvSaModel COUNT 分支销售单详情、出库列表Network 搜索 outBoundList、SaleDetail;代码重点 InvSaModel.php:223,263业务族已确认
23 对账单按客户去重 COUNT/index.php/report/customerBalance_detailReport::customerBalance_detail → ReportService::get_customerBalance_detail → getCustomerBalanceData → InvSaModel::querySaleInvoiceStatementreport/customers-reconciliation-newstatics/old/js/dist/customersReconciliationNew.js;搜索 customerBalance_detail已确认
24 对账单按客户筛选结算明细/index.php/report/customerBalance_detail、导出 customerBalance_exporterReport → ReportService::getCustomerBalanceData → InvSaModel::querySaleInvoiceStatement / querySaleInvoiceInfoStatementreport/customers-reconciliation-new、reconciliationOrderList、reconciliationOrderDetail搜索 customerBalance_detail、customerBalance_exporter、querySaleInvoiceStatement已确认
25 销售详情/列表,付款 + 多基础表/index.php/scm/invSa/outBoundList、销售详情动作InvSa → InvSaService → InvSaModel::querySaleInvoice出库列表、销售订单、销售详情Network 搜索 outBoundList、SaleDetail;按返回字段确认是列表还是详情已确认
26 采购发票 COUNT + 付款/出库/明细采购报表 COUNT 接口:puDetail_detail、puDetail_inv、puDetail_supply 等Report → ReportService → 采购发票 Model/采购报表聚合方法report/pu-detail-new、new-pu-detail-new、pu-summary-new搜索 puDetail_detail、puDetail_inv、puDetail_supply业务族已确认
27 机器人会话 status 查询RobotStat::getMessages、统计/导出接口;也可能是会话任务查询RobotStat / RobotStatV2 → ConversationModel机器人统计/会话管理页面RobotStat.php 搜索 getMessages;Network 搜索 getMessages;任务侧查 status=1业务族已确认
28 报价基础表 UPDATE ... JOIN 批次更新php index.php tasks/QuoteGoodsBase/... 任务族;具体批次动作需按 SQL 版本确认tasks/QuoteGoodsBase → QuoteManagerBaseSer / QuoteGoodsBaseModel无固定页面;报价页面是被更新数据的消费者application/controllers/tasks/QuoteGoodsBase.php;搜索 tmp_guidance_batch、UPDATE、base_id待确认;生产 SQL 使用临时批次表
29 销售详情 COUNT销售列表/详情分页 COUNT 接口InvSa → InvSaService → InvSaModel COUNT 分支出库列表、销售详情Network 搜索 outBoundList、SaleDetail,对照返回的 total业务族已确认
30 销售详情/列表复杂 JOIN/index.php/scm/invSa/outBoundList 或详情动作InvSa → InvSaService → InvSaModel出库列表、销售订单、详情页搜索 outBoundList、getSalesOrderListNew、SaleDetail业务族已确认
31 销售单付款状态/客户信息销售列表、客户对账、资金明细接口,完整 SQL 才能唯一归属InvSaService / ReportService → InvSaModel 或 ReportModel出库列表、客户对账、资金明细Network 搜索 outBoundList、customerBalance_detail、fundBalance_detail业务族已确认
32 采购发票列表 + 客户/付款/出库采购报表详情/列表接口Report → ReportService → 采购发票/采购报表 Modelreport/pu-detail-new、pu-summary-new、供应商对账搜索 pu_detail_new、puDetail_detail、supplierBalance_detail业务族已确认
33 销售详情 COUNT销售列表/详情分页 COUNT 接口InvSa → InvSaService → InvSaModel COUNT 分支出库列表、销售详情Network 搜索 outBoundList、SaleDetail;查看请求是否带分页参数业务族已确认
34 销售订单号/描述 %LIKE%销售订单查询接口,当前部署路由待确认当前 DGJ2 未能把该指纹唯一落到 Controller;先查销售订单服务/InvSa 相关路由销售订单列表/搜索页面,具体 View 待部署版本核对搜索前端 订单号、description、getSalesOrder;抓 Request URL 后再反查待确认
35 客户应收按客户聚合/index.php/report/getCustomerBalance、customer_balance_receivable、customerBalance_detail 等Report → ReportService / ReportModel::get_contact2、splitContact2report/contact_debt_new、客户欠款/应收页面customerBalanceReceivable.js 搜索 getCustomerBalance;菜单 View 搜索 contact_debt_new业务族已确认;线上版本待核对
36 销售列表 COUNT/index.php/scm/invSa/outBoundList 等列表接口InvSa → InvSaService → InvSaModel COUNT 分支出库列表、销售列表搜索 outBoundList;代码重点 InvSaService.php:3156-3159已确认
37 销售列表复杂 JOIN/index.php/scm/invSa/outBoundList、salesReturnListNewInvSa → InvSaService → InvSaModel出库列表、销售退货列表搜索 outBoundList、salesReturnListNew;Network 查看列表页 Initiator已确认
38 条码 COUNT 包装查询PDA 商品查询接口TakeStockSer → Data_model_app::getPdaSkusByBarcodePDA 扫码/商品选择搜索 getPdaSkusByBarcode、COUNT、barcode业务族已确认
39 调拨申请列表,申请方/发货方 OR/index.php/stf/apply?action=list 或 /index.php/stf/apply/liststf/Apply → ApplySer → StfApplyModel::getPageListapplication/views/stf/apply/list.phppublic/js/page/stf/list.js、statics/old/js/dist/transfersListS.js;搜索 stf/apply已确认
40 报价基础表结算价为零检查php index.php tasks/QuoteGoodsBase/initSettlePricetasks/QuoteGoodsBase::initSettlePrice → QuoteGoodsBaseModel/报价基础服务无固定页面application/controllers/tasks/QuoteGoodsBase.php:1175,1182;CLI:php index.php tasks/QuoteGoodsBase/initSettlePrice,每 5 分钟任务已确认

#41~#61

排名 / SQL 定位接口或脚本Controller → Service → Model页面 / View前端 JS、请求关键词或任务入口证据级别
41 客户应收排行榜,余额排序/index.php/report/contact_debt_new、getCustomerBalance、customer_balance_receivableReport → ReportService / ReportModel::get_contact2、getCustomerBalanceInforeport/contact_debt_new、客户欠款排行榜customerBalanceReceivable.js 搜索 getCustomerBalance;菜单配置搜索 ContactDebtReport_QUERY业务族已确认;线上版本待核对
42 条码/物料编码分组查询PDA/移动商品查询接口TakeStockSer → Data_model_app::getPdaSkusByBarcodePDA 扫码、商品选择搜索 getPdaSkusByBarcode、itemCode、barcode已确认
43 库存按商品/日期汇总/index.php/report/deliverSummary?action=detail、deliverSummary_cost;导出 deliverSummary_exporterReport → ReportService::get_deliverSummary → ReportModel::get_deliverSummaryapplication/views/report/goods-flow-summary.phpstatics/old/js/dist/goodsFlowSummary.js;搜索 deliverSummary已确认
44 机器人会话连续 ID 全量读取机器人统计/导出接口,具体动作需按 SQL 参数确认RobotStat / RobotStatV2 → ConversationModel机器人会话历史/统计页面,导出也可能触发搜索 getMessages、exportConversation、exportTriggerRecordsCsv;批处理查 ID 范围业务族已确认
45 机器人会话记录连续 ID 全量读取RobotStatV2 会话记录/导出接口RobotStatV2 → ConversationRecordModel机器人会话记录、导出页面RobotStat.php 约 1272/1310/1343 的 fetch;搜索 ConversationRecord、export已确认
46 销售单按状态/日期校验结清销售列表、销售报表或付款状态接口,完整 SQL 参数才能唯一归属InvSaService / ReportService → InvSaModel 或付款聚合方法出库列表、销售报表、客户对账Network 搜索 outBoundList、customerBalance_detail、fundBalance_detail;看付款状态字段业务族已确认
47 出库列表 + 付款聚合 + 客户/门店/index.php/scm/invSa/outBoundListInvSa → InvSaService → InvSaModel::querySaleInvoiceapplication/views/scm/invSa/deliveryList.php搜索 outBoundList,从 Initiator 回到销售列表 JS已确认
48 机器人历史会话连续 ID机器人历史会话查询/导出接口RobotStat / ConversationModel机器人会话历史页面搜索 getMessages、exportConversation;确认请求的 id 起止范围业务族已确认
49 采购订单复杂 COUNT/index.php/po/purchaseOrder/info 的 COUNT 分支PurchaseOrder → PoOrderInfoSer → PoOrderInfoModel::getPageList采购订单列表搜索 purchaseOrder/info,比较 COUNT 与明细请求已确认
50 客户应收深度分页/index.php/report/contact_debt_new 或 getCustomerBalanceReport → ReportService / ReportModel::get_contact2客户欠款/应收排行榜搜索 getCustomerBalance、contact_debt_new;查看 page、limit 和排序参数业务族已确认;线上版本待核对
51 销售明细报表 + 成本/商品/客户 JOIN/index.php/report/salesDetail_detail、salesDetail_detail_cost;导出 salesDetail_detailExporterReport → ReportService::salesDetail_detail → ReportModel / InvSaModel::querySaleInvoiceInfoStatementreport/sales-detail、sales-detail-newstatics/old/js/dist/salesDetail.js、salesDetailStation.js;搜索 salesDetail_detail已确认
52 报价订单 COUNT报价订单列表接口,具体路由需结合报价页面请求确认OfferOrderInfoModel / 报价订单 Service报价订单列表/报价管理页面搜索前端 quotationList、offer、count,再由 Network Initiator 定位业务族已确认
53 商品条码精确查询PDA 条码查询接口TakeStockSer → Data_model_app::getPdaSkusByBarcodePDA 盘点扫码、商品选择搜索 getPdaSkusByBarcode、getScanData已确认
54 账户流水历史付款汇总/index.php/report/oriDetail_detail、bankBalance_detail;也可能来自收付款页面Report → ReportService::bankBalance_detail / Data_model::get_account_info;收款/付款服务也复用该 Model账户流水、银行余额、收款/付款明细搜索 oriDetail_detail、bankBalance_detail、get_account_info;Network 看账户参数业务族已确认
55 采购订单多字段 %LIKE%/index.php/po/purchaseOrder/info 或采购订单搜索接口PurchaseOrder → PoOrderInfoSer → PoOrderInfoModel采购订单列表/搜索页搜索 purchaseOrder/info、keyword、sku、sourceOrder;查看 Request Payload业务族已确认
56 收款明细 + 付款派生表/index.php/scm/receipt/get_receipt_detail_newscm/Receipt → ReceiptService::get_receipt_detail_new → 收款/付款 Modelapplication/views/scm/receipt/initReceiptListNew.phppublic/js/api/receipt/receiptList.js:33;Network 搜索 get_receipt_detail_new已确认
57 销售明细分类报表 + 成本/index.php/report/salesDetail_detail、salesDetail_detail_costReport → ReportService::salesDetail_detail → InvSaModel::querySaleInvoiceInfoStatement / 成本价 Modelreport/sales-detail、sales-detail-newsalesDetail.js、salesDetailStation.js;搜索 salesDetail_detail_cost已确认
58 销售订单 COUNT + 订单号/描述模糊搜索销售订单查询接口,当前部署路由待确认当前 DGJ2 未找到该 SQL 指纹的唯一 Controller;候选为销售订单查询业务族销售订单列表/搜索页面,具体 View 待确认搜索 订单号、description、getSalesOrder、COUNT;从 Network Request URL 反查待确认
59 收款明细 + 付款派生表/index.php/scm/receipt/get_receipt_detail_newscm/Receipt → ReceiptService::get_receipt_detail_new → 收款/付款 Modelscm/receipt/initReceiptListNew.phppublic/js/api/receipt/receiptList.js;搜索 get_receipt_detail_new已确认
60 报价基础表与商品表指导价/结算价比对报价指导价同步/巡检任务,具体任务方法需按完整 SQL 版本确认QuoteGoodsBase / QuoteManagerBaseSer → QuoteGoodsBaseModel无固定页面;报价规则页/报价商品页只是读取结果搜索 guide_price、guide_plan_id、tmp_guidance_batch、QuoteGoodsBase;检查 Cron/任务日志业务族已确认;具体脚本待确认
61 维修站地域 + 用户关联 COUNT当前 DGJ2 未找到对应接口或任务当前仓库没有 kxj_repair_depot / kxj_user_depot_relation 的完整入口页面与 View 待确认先在部署服务、兄弟仓库和网关日志搜索 kxj_repair_depot、user_depot_relation;确认服务归属后再回查前端待确认;外部/兄弟业务

3.3.2 从页面定位慢 SQL 请求源头

对于已确认的接口,可以按下面路径复现;“业务族已确认”和“待确认”条目必须先拿到真实请求参数,不能只看表名猜页面。

  1. 打开矩阵中的页面 View,对应进入列表、查询、分页、详情或导出动作。
  2. 浏览器按 F12 → Network,勾选 Preserve log 后刷新页面;只触发一个动作,避免把多个 SQL 族混在一起。
  3. 在 Network 搜索接口关键词:getCustomerAccount、outBoundList、getSalesOrderListNew、getPdBarCode/getPdaSkusByBarcode、getLessReturnGoods、quotationList、fundBalance_detail、customerBalance_detail、salesDetail_detail、deliverSummary、get_receipt_detail_new。
  4. 打开请求查看 Request URL、Query/Payload、Response 和 Initiator。重点记录 sid、分页 page/limit、客户/订单/商品 ID、日期、状态条件;这些参数决定了同一 SQL 族实际走哪一分支。
  5. 根据 URL 回查 application/controllers,再沿 Controller → Service → Model 跟进。销售/应收优先查 InvSaService、ReceiptService、ReportService;采购查 PoOrderInfoSer;PDA 查 TakeStockSer;机器人查 RobotStat。
  6. 在前端按矩阵中的关键词回查 public/js/page、public/js/api、statics/old/js/dist;Initiator 通常能直接显示触发请求的 JS 文件和行号。
  7. 如果 Network 没有请求而 DAS 仍有 SQL,检查 application/controllers/tasks、Cron、Supervisor、MQ consumer 和任务日志。#28、#40、#60 属于这个路径;例如 #40 的可执行入口是 php index.php tasks/QuoteGoodsBase/initSettlePrice。
  8. 最后用 SQL 的分表后缀、sid、表名和字段反向核对:分表后缀来自 sid 选择逻辑;同一 Model 被多个页面复用时,只能把归属写成“业务族已确认”,直到完整 SQL 参数或应用日志把它收敛到单一请求。

定位时要保留三个边界:DAS 提供的是 SQL 模板和统计指标,不保证带有完整调用栈;SQL 被截断或参数折叠时无法唯一反推页面;一个 Model 方法可以被接口、导出和定时任务共同调用。因此“业务族已确认/待确认”是证据等级,不是遗漏,也不能据此直接修改代码。

3.4 当前快照的优先级结论

优先级先做对象原因不建议直接做的事情
P0价格变更/指导价检查(28、40、60)、成本价(7)、条码精确路径(17、19、21、38、42、53)边界较清楚,结果可按商品/版本/输入用例逐项比对;部分已经有明确候选方案。不要仅凭 DAS 的“扫描行多”删除 GROUP BY、活动价条件或状态条件。
P1销售列表 COUNT/分页(9、12、13、22、29、33、36)、采购订单 COUNT/列表(18、20、49、52、55)、调拨(39)重复扫描明显,低风险动作是把 COUNT、主单和扩展查询拆开;仍需确认分页/权限语义。不要在未确认产品只需要“下一页”前把精确总页数改成 limit + 1。
P1销售付款/对账/采购金额(1、3、4、8、23~26、31、32、35、41、46、50、51、54、56、57、59)性能收益可能最大,但金额口径、退货、核销、撤销和跨日边界风险也最高。不要只改 LEFT JOIN、billStatus、金额正负号或把派生表直接换成 INNER JOIN。
P2机器人大批量读取(27、44、45、48)、SAAS ID 区间(14、15)主要问题是业务真的返回大量数据,单纯加索引不能消除传输和 PHP 处理。不要在 DGJ2 主仓库直接修改 t_sale_order 兄弟服务。
P2模糊检索和外部维修站查询(34、55、58、61)必须先确认真实部署服务、召回要求、权限和表结构,才能设计索引或搜索服务;库存汇总(43)单独按日期/商品集合验证。不要为了速度把 %keyword% 改成前缀匹配而悄悄缩小召回范围。

3.5 61 条慢查询的具体 SQL 结构(页面原文逐条核对)

上一版只展示了指纹,确实不足以支撑逐条评审。本节根据当前 DAS 页面 DOM 读取到的 SQL 单元格逐条整理。为避免把大批量客户/商品/订单 ID 写入共享文档,长 IN 列表的参数值被折叠;其余 SELECT、FROM、JOIN、WHERE、GROUP BY、ORDER BY、LIMIT 和表达式均保留。这里必须区分“具体 SQL 结构”和“可直接复制执行的完整 SQL”:第 2、3、8、11、35、43、60 条的长参数值在文档中折叠;第 7 条则是 DAS 页面自身在约 16,158 个字符处返回 ...,页面没有提供其完整后半段,不能假装补齐。

#1(5384 次,最大/平均 10.597/1.627 秒)

SELECT a.buId, SUM( CASE WHEN p.stlId IS NULL THEN a.amount WHEN ABS(a.amount) <= ABS(IFNULL(p.amount, 0)) + ABS(IFNULL(p.diffAmount, 0)) THEN 0 ELSE a.amount - IFNULL(p.amount, 0) - IFNULL(p.diffAmount, 0) END ) AS rePayment FROM t_scm_sa_invoice_0_10 AS a LEFT JOIN ( SELECT stlId, SUM(amount) AS amount, SUM(diffAmount) AS diffAmount FROM t_scm_payment_info_10 WHERE isDelete = 0 AND transType IN (150601, 150602) AND buId = 260219 AND sid = 2058 AND billStatus <> 6 GROUP BY stlId ORDER BY NULL ) AS p ON p.stlId = a.id WHERE a.isDelete = 0 AND a.buId = 260219 AND a.sid = 2058 AND a.billStatus <> 6 GROUP BY a.buId

#2(2011 次,最大/平均 17.840/2.612 秒)

SELECT `bf`.`invId`, MAX(`bf`.`id`) AS id FROM t_scm_sa_invoice_info_0_0 AS `bf` LEFT JOIN t_scm_sa_invoice_0_0 AS `cf` ON `bf`.`iid` = `cf`.`id` WHERE bf.sid = 1088 and bf.isDelete = 0 and bf.transType = 150601 and bf.invId IN (/* 原始 SQL 已读取;此处折叠 120 个参数 */) and cf.billStatus<6 GROUP BY `bf`.`invId`

#3(1894 次,最大/平均 6.929/1.866 秒)

select buId, billType, billDate, sum(amount) as amount, sum(diffAmount) as discount, createTime from t_scm_payment_info_29 where isDelete = 0 and billStatus not IN (6) and transType IN (150601,150602) and billType IN ('SALE','RECEIPT') and billDate < "2026-09-01" and sid = 1277 AND buId IN (/* 原始 SQL 已读取;此处折叠 802 个参数 */) group by buId

#4(1720 次,最大/平均 30.711/3.584 秒)

SELECT a.*, c.amount as payment1, c.diffAmount as diffAmount1 FROM t_scm_sa_invoice_0_34 AS a LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_2 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1058 GROUP BY stlId) AS c ON c.stlId = a.id WHERE (a.isDelete=0) and (a.billType="SALE" or a.billType="RECEIPT") and a.buId=152812 and a.sid = 1058 and a.createTime>="2026-09-02 18:00:00" and a.createTime<="2026-09-03 17:59:59" and a.billStatus < 6 order by id

#5(1611 次,最大/平均 20.364/5.252 秒)

SELECT a.*, c.name AS buName, e.name as storeName FROM t_scm_sa_invoice_0_57 AS a LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.type = "-10" AND c.sid IN (1401,1) AND c.isDelete = 0 LEFT JOIN t_bs_store e ON a.storeId = e.id AND e.sid = 1401 WHERE a.isDelete = 0 and a.sid = 1401 and a.transType = 150601 and a.billStatus IN (0,1,2,3,4,5) order by a.createTime desc limit 0,50

#6(1598 次,最大/平均 82.392/3.368 秒)

SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_54 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (1078,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1078,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_22 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1078 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_6 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) and (a.id=936104938352672768) and a.billType="SALE"

#7(1555 次,最大/平均 3.724/1.364 秒)

SELECT current.`invId`, current.`locationId`, current.`price` FROM t_bs_cost_price_day_6 AS current INNER JOIN ( SELECT `invId`, `locationId`, MAX(`id`) AS `id` FROM t_bs_cost_price_day_6 WHERE sid = 1078 AND ( invId IN (/* 原始 SQL 已读取;此处折叠 1000 个参数 */) OR invId IN (/* 原始 SQL 已读取;此处折叠 1000 个参数 */) OR invId IN (/* 原始 SQL 已读取;此处折叠 1000 个参数 */) OR invId IN (6284,6308,6317,6319,6320,6321,6322,6323,6324,6327,6328,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6349,6350,6352,6353,6354,6355,6356,6357,6358,6359,6360,6362,6364,6365,6366,6367,6368,6370,6371,6372,6373,6374,6375,6376,6378,6379,6380,6382,6383,6384,6385,6386,6387,6388,6390,6393,6394,6396,6397,6398,6399,6400,6401,6402,6404,6405,6407,6408,6411,6412,6413,6414,6416,6419,6420,6421,6423,6424,6425,6426,6427,6428,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6460,6461,6462,6463,6464,6465,6467,6470,6472,6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6496,6497,6498,6499,6500,6501,6503,6505,6506,6508,6509,6510,6511,6512,6514,6515,6516,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6531,6532,6534,6535,6537,6539,6540,6541,6542,6543,6544,6545,6548,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566...

#8(1080 次,最大/平均 3.629/1.471 秒)

SELECT buId, billType, billDate, sum(amount) as amount, createTime FROM t_scm_pu_invoice_24 WHERE isDelete = 0 AND billType IN ('PUR', 'PAYMENT') and billDate < "2026-09-01" and sid = 1560 AND buId IN (/* 原始 SQL 已读取;此处折叠 486 个参数 */) group by buId

#9(990 次,最大/平均 16.292/3.703 秒)

SELECT count(1) count from( SELECT * FROM t_scm_sa_invoice_0_19 WHERE sid = 1043 and transType = 150601 and billStatus IN (1,2,3) and sourceType < 2 and isDelete = 0 and billDate <= "2026-09-03" ) count

#10(980 次,最大/平均 71.301/2.921 秒)

SELECT a.*, c.amount as payment1, c.diffAmount as diffAmount1 FROM t_scm_sa_invoice_0_54 AS a LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_22 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1078 GROUP BY stlId) AS c ON c.stlId = a.id WHERE (a.isDelete=0) and (a.billType="SALE" or a.billType="RECEIPT") and a.buId=100162 and a.sid = 1078 and a.billDate>="2026-08-01" and a.billDate<="2026-08-31" and a.billStatus < 6 order by id

#11(860 次,最大/平均 14.878/2.809 秒)

SELECT `sa`.`id` FROM `t_scm_sa_order_15` as `sa` LEFT JOIN `t_scm_sa_order_info_15` as `info` ON `info`.`iid` = `sa`.`id` WHERE `sa`.`sid` = '1263' AND `info`.`invId` IN (/* 原始 SQL 已读取;此处折叠 28 个参数 */) AND `billStatus` IN (0, 1) AND `sa`.`isDelete` =0 AND `sa`.`transType` = 170502 GROUP BY `sa`.`id`

#12(844 次,最大/平均 30.800/7.871 秒)

SELECT count(1) count from( SELECT a.*, c.name AS buName, IFNULL(d.payAmount,0) AS payAmount,IFNULL(d.diffAmount,0) AS diffAmount, e.name as storeName FROM t_scm_sa_invoice_0_19 AS a LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.type = "-10" AND c.sid IN (1171,1) AND c.isDelete = 0 LEFT JOIN (SELECT SQL_BIG_RESULT SUM(IFNULL(amount,0)) as payAmount,SUM(IFNULL(diffAmount,0)) as diffAmount,stlId FROM t_scm_payment_info_19 WHERE isDelete = 0 and billStatus <> 6 and sid = 1171 and transType IN (150601,150602) GROUP BY stlId order by null) AS d ON a.id = d.stlId LEFT JOIN t_bs_store e ON a.storeId = e.id AND e.sid = 1171 WHERE a.isDelete = 0 and a.sid = 1171 and a.buId = 425907 and a.billDate >="2026-08-01" and a.billDate <="2026-08-31" and a.transType = 150601 and a.billStatus IN (4,0) and (abs(a.amount) > (abs(d.payAmount)+abs(d.diffAmount)) || (abs(a.rpAmount) + abs(IFNULL(d.diffAmount,0)) + abs(IFNULL(d.payAmount,0))) = 0) ) count

#13(821 次,最大/平均 30.741/6.416 秒)

SELECT a.*, c.name AS buName, IFNULL(d.payAmount,0) AS payAmount,IFNULL(d.diffAmount,0) AS diffAmount, e.name as storeName FROM t_scm_sa_invoice_0_19 AS a LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.type = "-10" AND c.sid IN (1171,1) AND c.isDelete = 0 LEFT JOIN (SELECT SQL_BIG_RESULT SUM(IFNULL(amount,0)) as payAmount,SUM(IFNULL(diffAmount,0)) as diffAmount,stlId FROM t_scm_payment_info_19 WHERE isDelete = 0 and billStatus <> 6 and sid = 1171 and transType IN (150601,150602) GROUP BY stlId order by null) AS d ON a.id = d.stlId LEFT JOIN t_bs_store e ON a.storeId = e.id AND e.sid = 1171 WHERE a.isDelete = 0 and a.sid = 1171 and a.buId = 425907 and a.billDate >="2026-08-01" and a.billDate <="2026-08-31" and a.transType = 150601 and a.billStatus IN (4,0) and (abs(a.amount) > (abs(d.payAmount)+abs(d.diffAmount)) || (abs(a.rpAmount) + abs(IFNULL(d.diffAmount,0)) + abs(IFNULL(d.payAmount,0))) = 0) order by a.createTime desc limit 0,50

#14(819 次,最大/平均 8.591/2.600 秒)

select id,order_id,inv_id,sku_id,goods_name,goods_img,category_name,`number`,refund_number,price,location_area_id,create_time,modify_time from t_sale_order_detail where (231644 <= id AND id < 463287)

#15(819 次,最大/平均 7.879/2.322 秒)

select id,sid,contact_id,user_id,order_no,order_type,`status`,order_amount,order_number,refund_number,create_time,modify_time from t_sale_order where (231647 <= id AND id < 463290)

#16(794 次,最大/平均 6.018/1.426 秒)

SELECT * FROM t_scm_po_order_info_0 WHERE (sid = 1088 and srcOrderEntryId <>0)

#17(712 次,最大/平均 1.820/1.251 秒)

select count(*) as count from (SELECT a.barCode, a.itemCode, a.companyCode, a.quantityUM, b.id AS invId, b.number, b.brandName, b.skuId, b.productCode, b. NAME, b.spec, b.packSpec, b.unitName, b.minNum AS qty FROM t_bs_goods_barcode AS a LEFT JOIN t_bs_goods AS b ON a.itemCode = b.skuId WHERE b.sid = 1 /*AND a.companyCode = "1001"*/ and (a.barcode like '%75w-90%' or a.itemCode like '%75w-90%' or b.skuId like '%75w-90%' or b.number like '%75w-90%') GROUP BY b.id ) as a

#18(695 次,最大/平均 41.216/5.404 秒)

SELECT count(1) count from( SELECT a.*, a.invName AS goods, aa.orderType, aa.orderCate, b. NAME AS baseName, b.number AS invNumber, b.spec AS invSpec, b. STATUS AS goodsStatus, b.unitName AS mainUnit, b.minNum, b.packSpec, b.brandName, b.saleModel, b.categoryId, IFNULL(c.lockNum, 0) lockNum, IFNULL(d.inQty, 0) inQty, IFNULL(c.closeQty, 0) closeQty FROM t_scm_po_order_info_20 AS a LEFT JOIN t_scm_po_order AS aa ON a.iid = aa.id LEFT JOIN ( SELECT id, NAME, number, spec, skuId, unitName, minNum, packSpec, STATUS, brandName, categoryId, saleModel, productCode, isDelete, isBadReturn FROM t_bs_goods WHERE (isDelete = 0) AND sid = 1 ) AS b ON a.invId = b.id LEFT JOIN ( SELECT SUM(a.qty) AS lockNum,a.srcOrderEntryId,SUM(closeQty) AS closeQty FROM t_scm_po_order_info_20 AS a LEFT JOIN t_scm_po_order AS b ON b.id = a.iid and b.sid = 1140 and b.isDelete = 0 LEFT JOIN ( SELECT isGift, invId,iid, srcOrderId, abs(SUM(qty)) closeQty FROM t_scm_po_close_info WHERE (isDelete = 0) AND sid = 1140 AND qty < 0 GROUP BY isGift, srcOrderId, invId ) AS e ON a.invId = e.invId AND b.id = e.iid AND IFNULL(e.closeQty, 0) > 0 where a.sid = 1140 and a.isDelete = 0 and b.billStatus IN (1,2,3,5,11) and b.orderType !='30-Cxx-17' GROUP BY a.srcOrderEntryId ) AS c ON c.srcOrderEntryId = a.id LEFT JOIN ( SELECT isGift, invId, srcOrderId, SUM(qty) inQty FROM t_scm_pu_invoice_info_20 WHERE (isDelete = 0) AND sid = 1140 GROUP BY isGift, srcOrderId, invId ) AS d ON a.invId = d.invId AND a.iid = d.srcOrderId AND a.isGift = d.isGift WHERE (a.isDelete = 0 AND aa.sid = 1140) AND a.sid = 1140 AND a.transType = 170401 AND b.isDelete = 0 AND IFNULL(d.inQty, 0) > 0 and b.isBadReturn = 0 and a.skuId = "1211110171" and aa.orderType not IN ('30-01','30-Cxx-75') HAVING lockNum+inQty+closeQty>0 order by a.id desc ) count

#19(660 次,最大/平均 10.233/3.559 秒)

SELECT a.barCode, a.itemCode, a.companyCode, a.quantityUM, b.id AS invId, b.number, b.brandName, b.skuId, b.productCode, b. NAME, b.spec, b.packSpec, b.unitName, b.minNum AS qty FROM t_bs_goods_barcode AS a LEFT JOIN t_bs_goods AS b ON a.itemCode = b.skuId WHERE b.sid = 1 /*AND a.companyCode = "1001"*/ and (a.barcode like '%b102010609%' or a.itemCode like '%b102010609%' or b.skuId like '%b102010609%' or b.number like '%b102010609%') GROUP BY b.id limit 0,10

#20(621 次,最大/平均 41.652/4.956 秒)

SELECT a.*, a.invName AS goods, aa.orderType, aa.orderCate, b. NAME AS baseName, b.number AS invNumber, b.spec AS invSpec, b. STATUS AS goodsStatus, b.unitName AS mainUnit, b.minNum, b.packSpec, b.brandName, b.saleModel, b.categoryId, IFNULL(c.lockNum, 0) lockNum, IFNULL(d.inQty, 0) inQty, IFNULL(c.closeQty, 0) closeQty FROM t_scm_po_order_info_27 AS a LEFT JOIN t_scm_po_order AS aa ON a.iid = aa.id LEFT JOIN ( SELECT id, NAME, number, spec, skuId, unitName, minNum, packSpec, STATUS, brandName, categoryId, saleModel, productCode, isDelete, isBadReturn FROM t_bs_goods WHERE (isDelete = 0) AND sid = 1 ) AS b ON a.invId = b.id LEFT JOIN ( SELECT SUM(a.qty) AS lockNum,a.srcOrderEntryId,SUM(closeQty) AS closeQty FROM t_scm_po_order_info_27 AS a LEFT JOIN t_scm_po_order AS b ON b.id = a.iid and b.sid = 1915 and b.isDelete = 0 LEFT JOIN ( SELECT isGift, invId,iid, srcOrderId, abs(SUM(qty)) closeQty FROM t_scm_po_close_info WHERE (isDelete = 0) AND sid = 1915 AND qty < 0 GROUP BY isGift, srcOrderId, invId ) AS e ON a.invId = e.invId AND b.id = e.iid AND IFNULL(e.closeQty, 0) > 0 where a.sid = 1915 and a.isDelete = 0 and b.billStatus IN (1,2,3,5,11) and b.orderType !='30-Cxx-17' GROUP BY a.srcOrderEntryId ) AS c ON c.srcOrderEntryId = a.id LEFT JOIN ( SELECT isGift, invId, srcOrderId, SUM(qty) inQty FROM t_scm_pu_invoice_info_27 WHERE (isDelete = 0) AND sid = 1915 GROUP BY isGift, srcOrderId, invId ) AS d ON a.invId = d.invId AND a.iid = d.srcOrderId AND a.isGift = d.isGift WHERE (a.isDelete = 0 AND aa.sid = 1915) AND a.sid = 1915 AND a.transType = 170401 AND b.isDelete = 0 AND IFNULL(d.inQty, 0) > 0 and b.isBadReturn = 0 and a.skuId = "B101010665" and aa.orderType not IN ('30-01','30-Cxx-75') HAVING lockNum+inQty+closeQty>0 order by a.id desc limit 0,20

#21(604 次,最大/平均 1.671/1.081 秒)

SELECT a.barCode, a.quantityUM, a.itemCode, a.companyCode, b.id as invId, b.number, b.brandName, b.skuId, b. NAME, b.spec, b.productCode, b.categoryName, group_concat(distinct a.barCode) as barcodes, b.minNum as qty FROM t_bs_goods AS b LEFT JOIN t_bs_goods_barcode AS a ON a.itemCode = b.skuId /* AND b.isDelete = 0*/ WHERE b.sid = 1 /*and a.companyCode = '1001' */ and (a.barcode IN ('6941743530710','06941743530710') OR a.itemCode = '6941743530710') GROUP BY a.itemCode HAVING a.itemCode IS NOT NULL ORDER BY a.companyCode asc, a.itemCode DESC

#22(584 次,最大/平均 45.025/3.175 秒)

SELECT count(1) count from( SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_40 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (2792,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (2792,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_8 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 2792 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_8 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) AND a.billType="SALE" AND a.billDate>="2026-09-01" AND a.billDate<="2026-09-03" AND a.sid = 2792 and a.billNo_type = 0 and a.transType=150602 ) count

#23(583 次,最大/平均 18.356/4.293 秒)

SELECT COUNT(DISTINCT a.buId) AS total FROM t_scm_sa_invoice_0_45 a LEFT JOIN (SELECT d.source_order_id FROM t_bs_statement_bill_detail_v2_45 d INNER JOIN t_bs_statement_bill_v2_45 b ON b.id = d.bill_id WHERE d.is_delete = 0 AND d.source_type IN ('150601', '150602') AND b.sid = 2861 AND b.is_delete = 0 AND b.robot_status = 1 AND b.start_time <= '2026-09-03 19:08:59' AND b.end_time >= '2026-09-02 17:30:00' GROUP BY d.source_order_id) already_sent ON already_sent.source_order_id = CAST(a.id AS CHAR) WHERE a.isDelete = 0 AND a.sid = 2861 AND (a.billType = 'SALE' OR a.billType = 'RECEIPT') AND a.billStatus <> 6 AND a.createTime >= '2026-09-02 17:30:00' AND a.createTime <= '2026-09-03 19:08:59' AND already_sent.source_order_id IS NULL

#24(539 次,最大/平均 21.463/3.932 秒)

SELECT a.buId AS contact_id FROM t_scm_sa_invoice_0_21 a LEFT JOIN (SELECT d.source_order_id FROM t_bs_statement_bill_detail_v2_21 d INNER JOIN t_bs_statement_bill_v2_21 b ON b.id = d.bill_id WHERE d.is_delete = 0 AND d.source_type IN ('150601', '150602') AND b.sid = 2517 AND b.is_delete = 0 AND b.robot_status = 1 AND b.start_time <= '2026-08-31 23:59:59' AND b.end_time >= '2026-08-01 00:00:00' GROUP BY d.source_order_id) already_sent ON already_sent.source_order_id = CAST(a.id AS CHAR) WHERE a.isDelete = 0 AND a.sid = 2517 AND (a.billType = 'SALE' OR a.billType = 'RECEIPT') AND a.billStatus <> 6 AND a.createTime >= '2026-08-01 00:00:00' AND a.createTime <= '2026-08-31 23:59:59' AND already_sent.source_order_id IS NULL GROUP BY a.buId ORDER BY a.buId ASC LIMIT 0, 100

#25(514 次,最大/平均 24.722/2.900 秒)

SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_19 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (1171,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1171,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_19 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1171 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_3 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) AND a.billType="SALE" AND a.billDate>="2026-09-01" AND a.billDate<="2026-09-03" AND a.sid = 1171 and a.billNo_type = 0 and a.transType=150602 order by a.id DESC limit 0,100

#26(503 次,最大/平均 21.866/3.151 秒)

SELECT count(1) count from( SELECT a.*,b.name AS contactName,b.number AS contactNumber,b.cCategory AS cCategory,b.cCategoryName AS cCategoryName,b.number as contactNo, e.srcOrderNo as nid, e.billNo as wid, e.outBillNo, c.amount as payment1 FROM t_scm_pu_invoice_17 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "10" AND b.sid IN (1489,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1489,1) AND d.isDelete = 0 LEFT JOIN (SELECT distinct(iid),srcOrderEntryId,srcOrderNo,invId,srcOrderId FROM t_scm_pu_invoice_info_17 where isDelete=0 and sid = 1489 group by iid) AS g ON g.iid=a.id LEFT JOIN t_scm_po_out_info_17 AS e ON e.id = g.srcOrderEntryId and g.invId = e.invId and e.sid = 1489 LEFT JOIN (SELECT sum(amount) as amount ,stlId FROM t_scm_payment_info_17 WHERE isDelete=0 and sid = 1489 and billType="PAYMENT" GROUP BY stlId) AS c ON c.stlId = a.id WHERE (a.isDelete=0) and a.billType="PUR" and a.sid = 1489 and a.billDate>="2026-09-01" and a.billDate<="2026-09-03" and a.transType=150501 ) count

#27(497 次,最大/平均 19.079/1.136 秒)

SELECT * FROM `t_scm_robot_conversation` WHERE `status` = 1

#28(489 次,最大/平均 1.973/1.146 秒)

UPDATE t_quote_goods_base_8 b JOIN tmp_guidance_batch x ON x.base_id=b.id SET b.low_price=x.target_price, b.guide_price=x.target_price WHERE b.guide_plan_id=0 AND b.sid=x.sid AND b.inv_id=x.inv_id AND b.sku_id=x.sku_id AND b.low_price=x.old_low AND b.guide_price=x.old_guide

#29(461 次,最大/平均 56.010/2.885 秒)

SELECT count(1) count from( SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_22 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (1622,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1622,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_22 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1622 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_6 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) AND a.billType="SALE" AND a.billDate>="2026-08-01" AND a.billDate<="2026-09-03" AND a.sid = 1622 and a.transType=150602 AND (b.name LIKE "%途虎工厂店%" OR a.description LIKE "%途虎工厂店%" OR a.userName LIKE "%途虎工厂店%" OR a.billNo LIKE "%途虎工厂店%") ) count

#30(428 次,最大/平均 52.119/2.864 秒)

SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_22 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (1622,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1622,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_22 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1622 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_6 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) AND a.billType="SALE" AND a.billDate>="2026-08-01" AND a.billDate<="2026-09-03" AND a.sid = 1622 and a.transType=150602 AND (b.name LIKE "%途虎工厂店%" OR a.description LIKE "%途虎工厂店%" OR a.userName LIKE "%途虎工厂店%" OR a.billNo LIKE "%途虎工厂店%") order by a.id DESC limit 0,100

#31(420 次,最大/平均 28.526/3.397 秒)

SELECT a.id,a.billNo,a.billDate,a.buId,a.transType,a.totalAmount,a.amount,IFNULL(a.billNo_type,0),b.wayId,b.reAmount,b.diffAmount, c.name AS buName, a.storeId, a.wayId as orderWayId,a.sourceType FROM t_scm_sa_invoice_0_43 AS a LEFT JOIN ( SELECT buId, stlId,wayId, sum(amount) reAmount, sum(diffAmount) diffAmount FROM t_scm_payment_info_11 WHERE sid = 1003 AND isDelete = 0 and transType IN (150601,150602) and billStatus <> 6 GROUP BY stlId,wayId ) as b on a.id = b.stlId LEFT JOIN t_bs_contact c ON a.buId = c.id where a.sid = 1003 and a.isDelete = 0 and a.billStatus < 6 and c.customType = 0 and a.buId=146433 and a.billDate>="2026-08-01" and a.billDate<="2026-08-31" ORDER BY a.billDate DESC

#32(388 次,最大/平均 22.294/2.934 秒)

SELECT a.*,b.name AS contactName,b.number AS contactNumber,b.cCategory AS cCategory,b.cCategoryName AS cCategoryName,b.number as contactNo, e.srcOrderNo as nid, e.billNo as wid, e.outBillNo, c.amount as payment1 FROM t_scm_pu_invoice_17 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "10" AND b.sid IN (1489,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1489,1) AND d.isDelete = 0 LEFT JOIN (SELECT distinct(iid),srcOrderEntryId,srcOrderNo,invId,srcOrderId FROM t_scm_pu_invoice_info_17 where isDelete=0 and sid = 1489 group by iid) AS g ON g.iid=a.id LEFT JOIN t_scm_po_out_info_17 AS e ON e.id = g.srcOrderEntryId and g.invId = e.invId and e.sid = 1489 LEFT JOIN (SELECT sum(amount) as amount ,stlId FROM t_scm_payment_info_17 WHERE isDelete=0 and sid = 1489 and billType="PAYMENT" GROUP BY stlId) AS c ON c.stlId = a.id WHERE (a.isDelete=0) and a.billType="PUR" and a.sid = 1489 and a.billDate>="2026-09-01" and a.billDate<="2026-09-03" and a.transType=150501 order by a.id desc limit 0,100

#33(384 次,最大/平均 69.512/2.841 秒)

SELECT count(1) count from( SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_24 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (1560,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1560,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_24 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1560 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_8 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) AND a.billType="SALE" AND a.billDate>="2026-09-01" AND a.billDate<="2026-09-03" AND a.sid = 1560 and a.transType=150602 ) count

#34(380 次,最大/平均 63.238/31.631 秒)

SELECT `id`, `sid`, `billNo`, `buId`, `storeId`, `sourceType`, `storeId`, `salesId`, `totalAmount`, `disAmount`, `billStatus`, `createTime`, `uid`, `delieverId`, `wayId`, `description`, `payType`, `isKzVip`, `hxStateCode`, `billNo_type`, `is_pay`, `vin`, `car_model`, `activity_id`, `pay_time`, `printing_times` FROM `t_scm_sa_order_11` WHERE `billType` = 'SALE' AND `transType` = '170502' AND `sid` = '3883' AND `billStatus` IN (0, 1, 2) AND `isDelete` =0 AND ( `billNo` LIKE '%XD3883202604070006%' ESCAPE '!' OR `description` LIKE '%XD3883202604070006%' ESCAPE '!' ) ORDER BY `id` desc LIMIT 50

#35(368 次,最大/平均 24.008/8.217 秒)

SELECT a.id, sum(b.amount) as sAmount, sum(c.reAmount) as reAmount, sum(c.diffAmount) as diffAmount FROM t_bs_contact as a LEFT JOIN t_scm_sa_invoice_0_19 AS b ON a.id = b.buId AND b.isDelete = 0 AND b.billStatus < 6 AND b.sid = 1171 LEFT JOIN ( SELECT buId, stlId, sum(amount) reAmount, sum(diffAmount) diffAmount FROM t_scm_payment_info_19 WHERE sid = 1171 AND isDelete = 0 and billStatus <> 6 and transType IN (150601,150602) and billDate>="2026-09-01" GROUP BY stlId ) as c on b.id = c.stlId WHERE a.sid = 1171 AND a.isDelete = 0 AND a.type = -10 AND a.customType = 0 and b.billDate>="2026-09-01" and a.id IN (/* 原始 SQL 已读取;此处折叠 636 个参数 */) GROUP BY a.id

#36(355 次,最大/平均 10.964/2.047 秒)

SELECT count(1) count from( SELECT a.*, c.name AS buName, IFNULL(d.payAmount,0) AS payAmount,IFNULL(d.diffAmount,0) AS diffAmount, e.name as storeName FROM t_scm_sa_invoice_0_17 AS a LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.type = "-10" AND c.sid IN (1553,1) AND c.isDelete = 0 LEFT JOIN (SELECT SQL_BIG_RESULT SUM(IFNULL(amount,0)) as payAmount,SUM(IFNULL(diffAmount,0)) as diffAmount,stlId FROM t_scm_payment_info_17 WHERE isDelete = 0 and billStatus <> 6 and sid = 1553 and transType IN (150601,150602) GROUP BY stlId order by null) AS d ON a.id = d.stlId LEFT JOIN t_bs_store e ON a.storeId = e.id AND e.sid = 1553 WHERE a.isDelete = 0 and a.sid = 1553 and a.buId = 170828 and a.billDate >="2026-08-01" and a.billDate <="2026-08-31" and abs(a.amount) > 0 and (abs(a.rpAmount) + abs(IFNULL(d.diffAmount,0)) + abs(IFNULL(d.payAmount,0))) = 0 and sourceType!=4 and a.transType = 150601 and a.billStatus IN (0,1,2,3,4,5) ) count

#37(343 次,最大/平均 57.660/2.674 秒)

SELECT a.*, b.name AS contactName, b.number AS contactNumber, b.cCategory AS cCategory, b.cCategoryName AS cCategoryName, b.number as contactNo, c.amount as payment1, c.diffAmount as diffAmount1, e.number AS salesNo, e.NAME AS salesName, f.NAME AS accountName, g.NAME as delieverName, h.NAME as storeName, i.id as saleOrId, i.billNo as saleOrNo FROM t_scm_sa_invoice_0_24 AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.type = "-10" AND b.sid IN (1560,1) AND b.isDelete = 0 LEFT JOIN t_bs_contact_ext AS d ON a.buId = d.contactId AND d.type = "10" AND d.sid IN (1560,1) AND d.isDelete = 0 LEFT JOIN (SELECT sum(amount) as amount ,sum(diffAmount) as diffAmount,stlId FROM t_scm_payment_info_24 WHERE isDelete=0 and transType IN (150601,150602) and billStatus <> 6 and sid = 1560 GROUP BY stlId) AS c ON c.stlId = a.id LEFT JOIN t_bs_staff e ON a.salesId = e.id LEFT JOIN t_bs_staff g ON a.delieverId = g.id LEFT JOIN t_bs_account f ON a.accId = f.id LEFT JOIN t_bs_store h ON a.storeId = h.id LEFT JOIN t_scm_sa_order_8 i ON a.srcOrderId = i.id WHERE (a.isDelete=0) AND a.billType="SALE" AND a.billDate>="2026-09-01" AND a.billDate<="2026-09-03" AND a.sid = 1560 and a.transType=150602 order by a.id DESC limit 0,100

#38(337 次,最大/平均 1.877/1.256 秒)

select count(*) as count from (SELECT a.barCode, a.itemCode, a.companyCode, a.quantityUM, b.id AS invId, b.number, b.brandName, b.skuId, b.productCode, b. NAME, b.spec, b.packSpec, b.unitName, b.minNum AS qty FROM t_bs_goods_barcode AS a LEFT JOIN t_bs_goods AS b ON a.itemCode = b.skuId WHERE b.sid = 1 /*AND a.companyCode = "1001"*/ and (a.barCode like '%BGT61140%' or a.itemCode like '%BGT61140%' or b.skuId like '%BGT61140%' or b.number like '%BGT61140%') GROUP BY b.id ) as a

#39(320 次,最大/平均 1.544/1.118 秒)

SELECT `id`, `bill_no`, `bill_status`, `apply_sid`, `deliver_sid`, `in_price`, `out_price`, `remark`, `u_id`, `u_name`, `create_time`, `in_time`, `out_time` FROM `t_scm_stf_apply` WHERE (`apply_sid` = 5609 or `deliver_sid` = 5609) AND `bill_no` like '%%' ORDER BY `create_time` desc LIMIT 20

#40(316 次,最大/平均 2.020/1.116 秒)

select sid from t_quote_goods_base_14 where last_settle_price = 0 and current_settle_price=0 and bi_id = 0 and create_time > '2026-09-03 21:55:01' and create_time < '2026-09-03 22:00:01'

#41(305 次,最大/平均 62.213/11.604 秒)

SELECT count(1) count from( SELECT a.id, a.number, a.name, b.* FROM t_bs_contact AS a INNER JOIN ( SELECT a.buId, sum(a.amount) AS amount, sum(a.reAmount) AS amount1, sum(a.diffAmount) AS diffAmount, sum(rePayment) AS rePayment /*客户欠款*/ , (sum(rePayment) + b.debt_amount) AS rePayment1 /*客户应收余额[+期初欠款]*/ FROM ( SELECT a.amount, a.transType, a.billStatus, b.amount AS reAmount, b.diffAmount, IF ( transType = 150601, ( abs(a.amount) - IFNULL(abs(b.amount), 0) - IFNULL(abs(b.diffAmount), 0) ), - ( abs(a.amount) - IFNULL(abs(b.amount), 0) - IFNULL(abs(b.diffAmount), 0) ) ) rePayment, a.buId FROM t_scm_sa_invoice_0_58 AS a LEFT JOIN ( SELECT sum(amount) amount, sum(diffAmount) AS diffAmount, stlId FROM t_scm_payment_info_26 WHERE isDelete = 0 AND sid = 1338 AND transType IN (150601, 150602) AND billStatus <> 6 GROUP BY stlId ) AS b ON a.id = b.stlId WHERE a.isDelete = 0 AND sid = 1338 AND a.billStatus <> 6 HAVING IFNULL(abs(a.amount), 0) > ( IFNULL(abs(b.amount), 0) + IFNULL(abs(b.diffAmount), 0) ) ) AS a LEFT JOIN t_bs_contact_ext AS b ON a.buId = b.contactId WHERE b.isDelete = 0 GROUP BY buId ) AS b ON b.buId = a.id where a.isDelete = 0 AND a.sid = 1338 AND a.type = - 10 ) count

#42(302 次,最大/平均 9.384/3.588 秒)

SELECT a.barCode, a.itemCode, a.companyCode, a.quantityUM, b.id AS invId, b.number, b.brandName, b.skuId, b.productCode, b. NAME, b.spec, b.packSpec, b.unitName, b.minNum AS qty FROM t_bs_goods_barcode AS a LEFT JOIN t_bs_goods AS b ON a.itemCode = b.skuId WHERE b.sid = 1 /*AND a.companyCode = "1001"*/ and (a.barCode like '%1201000313%' or a.itemCode like '%1201000313%' or b.skuId like '%1201000313%' or b.number like '%1201000313%') GROUP BY b.id limit 0,20

#43(302 次,最大/平均 11.647/3.281 秒)

select invId,sum(qty) as qty from t_scm_inventory_0_54 where isDelete = 0 and sid = 1078 and billDate >= '2026-09-02' and invId IN (/* 原始 SQL 已读取;此处折叠 314 个参数 */) and transType IN (150601,150602)group by invId

#44(288 次,最大/平均 5.287/2.612 秒)

select id,cv_key,cv_type,chat_group_id,wxid,wxname,sid,contact_id,contact_name,start_text,start_keyword,last_keyword,`status`,close_time,create_time,modify_time from t_scm_robot_conversation where (9573960 <= id AND id < 9687233)

#45(288 次,最大/平均 51.375/42.390 秒)

select id,cv_id,sid,station_name,contact_id,contact_name,chat_group_id,chat_group_name,wxid,wxname,headimgurl,role,source_content,source_type,`text`,text_flag,text_flag_order_type,keyword,`status`,create_time,modify_time,request_id from t_scm_robot_conversation_record where (63732885 <= id AND id < 64665842)

#46(275 次,最大/平均 10.856/2.117 秒)

SELECT count(id) as num, billStatus FROM t_scm_sa_invoice_0_3 AS a LEFT JOIN (SELECT SUM(IFNULL(amount,0)) as payAmount,SUM(IFNULL(diffAmount,0)) as diffAmount,stlId FROM t_scm_payment_info_3 WHERE isDelete = 0 and billStatus <> 6 and sid = 1347 and transType IN (150601,150602) GROUP BY stlId) AS d ON a.id = d.stlId WHERE a.isDelete = 0 and a.sid = 1347 AND a.billStatus IN (1,2,3) and a.buId = 111197 and a.billDate >="2026-08-30" and a.billDate <="2026-09-03" and abs(a.amount) > 0 and (abs(a.rpAmount) + abs(IFNULL(d.diffAmount,0)) + abs(IFNULL(d.payAmount,0))) = 0 and sourceType!=4 and a.transType = 150601 group by a.billStatus

#47(275 次,最大/平均 11.426/2.030 秒)

SELECT a.*, c.name AS buName, IFNULL(d.payAmount,0) AS payAmount,IFNULL(d.diffAmount,0) AS diffAmount, e.name as storeName FROM t_scm_sa_invoice_0_61 AS a LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.type = "-10" AND c.sid IN (1277,1) AND c.isDelete = 0 LEFT JOIN (SELECT SQL_BIG_RESULT SUM(IFNULL(amount,0)) as payAmount,SUM(IFNULL(diffAmount,0)) as diffAmount,stlId FROM t_scm_payment_info_29 WHERE isDelete = 0 and billStatus <> 6 and sid = 1277 and transType IN (150601,150602) GROUP BY stlId order by null) AS d ON a.id = d.stlId LEFT JOIN t_bs_store e ON a.storeId = e.id AND e.sid = 1277 WHERE a.isDelete = 0 and a.sid = 1277 and a.buId = 58213 and a.billDate >="2023-08-01" and a.billDate <="2026-09-03" and abs(a.amount) > 0 and (abs(a.rpAmount) + abs(IFNULL(d.diffAmount,0)) + abs(IFNULL(d.payAmount,0))) = 0 and sourceType!=4 and a.transType = 150601 and a.billStatus IN (0,1,2,3,4,5) order by a.createTime desc limit 0,50

#48(273 次,最大/平均 4.415/1.437 秒)

select id,cv_key,cv_type,chat_group_id,wxid,wxname,sid,contact_id,contact_name,start_text,start_keyword,last_keyword,`status`,close_time,create_time,modify_time from t_scm_robot_conversation_history where (8579229 <= id AND id < 8629683)

#49(272 次,最大/平均 3.830/1.662 秒)

SELECT count(1) count from( SELECT a.*, a.invName as goods,aa.orderType,aa.orderCate,aa.paymentType,aa.createTime,aa.buName,aa.buType,aa.is_exclusive, b.name AS baseName, b.number AS invNumber, b.spec AS invSpec, b.status As goodsStatus, b.unitName AS mainUnit, b.minNum, b.packSpec, b.brandName, b.saleModel,b.status,b.categoryId, aa.srcOrderType, aa.saleId,aa.billStatus,aa.document_type ,IFNULL(c.wmsNo,"") wmsNo,IFNULL(c.outQty,0) outQty, IFNULL(d.inQty,0) inQty, IFNULL(e.closeQty,0) closeQty, a.qty - IFNULL(d.inQty,0) - IFNULL(c.outQty,0) - IFNULL(e.closeQty,0) waitQty FROM t_scm_po_order_info_9 AS a LEFT JOIN t_scm_po_order AS aa ON a.iid = aa.id LEFT JOIN ( SELECT id, NAME, number, spec,skuId, unitName, minNum, packSpec, status, brandName, saleModel,categoryId FROM t_bs_goods WHERE (isDelete = 0) AND sid = 1) AS b ON a.invId = b.id LEFT JOIN ( SELECT isGift,invId, srcOrderId, wmsNo, SUM(qty) outQty FROM t_scm_po_out_info_9 WHERE (isDelete = 0) and billStatus = 0 and sid=3689 GROUP BY isGift,srcOrderId,invId ) AS c ON a.invId = c.invId and a.iid = c.srcOrderId and a.isGift = c.isGift LEFT JOIN ( SELECT x1.isGift,x1.invId, x1.srcOrderId, SUM(x1.qty) inQty FROM t_scm_pu_invoice_info_9 x1 force index(idx_search) JOIN ( SELECT a.invId,a.iid,a.isGift FROM t_scm_po_order_info_9 a JOIN t_scm_po_order aa ON a.iid = aa.id LEFT JOIN ( SELECT isGift, invId, srcOrderId, wmsNo, SUM(qty) AS outQty FROM t_scm_po_out_info_9 WHERE (isDelete = 0) AND billStatus = 0 AND sid = 3689 GROUP BY isGift, srcOrderId, invId ) c ON a.invId = c.invId AND a.iid = c.srcOrderId AND a.isGift = c.isGift WHERE a.sid = 3689 and aa.sid=3689 and a.transType = 170401 and aa.billStatus IN (3,4) and aa.billStatus > 1 ) x2 ON x2.invId=x1.invId AND x2.iid = x1.srcOrderId AND x2.isGift = x1.isGift WHERE (x1.isDelete = 0) and x1.sid=3689 GROUP BY x1.isGift,x1.srcOrderId,x1.invId ) AS d ON a.invId = d.invId and a.iid = d.srcOrderId and a.isGift = d.isGift LEFT JOIN ( SELECT x1.isGift,x1.invId, x1.srcOrderId, SUM(x1.qty) closeQty FROM t_scm_po_close_info x1 JOIN ( SELECT a.invId,a.iid,a.isGift FROM t_scm_po_order_info_9 a JOIN t_scm_po_order aa ON a.iid = aa.id LEFT JOIN ( SELECT isGift, invId, srcOrderId, wmsNo, SUM(qty) AS outQty FROM t_scm_po_out_info_9 WHERE (isDelete = 0) AND billStatus = 0 AND sid = 3689 GROUP BY isGift, srcOrderId, invId ) c ON a.invId = c.invId AND a.iid = c.srcOrderId AND a.isGift = c.isGift WHERE a.sid = 3689 and aa.sid=3689 and a.transType = 170401 and aa.billStatus IN (3,4) and aa.billStatus > 1 ) x2 ON x2.invId=x1.invId AND x2.iid = x1.srcOrderId AND x2.isGift = x1.isGift WHERE (x1.isDelete = 0) and x1.sid=3689 GROUP BY x1.isGift,x1.srcOrderId,x1.invId ) AS e ON a.invId = e.invId and a.iid = e.srcOrderId and a.isGift = e.isGift WHERE (a.isDelete = 0 and aa.sid = 3689) and a.sid = 3689 and aa.sid=3689 and a.transType = 170401 and aa.billStatus IN (3,4) and (a.qty - IFNULL(d.inQty,0) - IFNULL(c.outQty,0) - IFNULL(e.closeQty,0)) > 0 and aa.billStatus > 1 ) count

#50(264 次,最大/平均 60.999/11.846 秒)

SELECT a.id, a.number, a.name, b.* FROM t_bs_contact AS a INNER JOIN ( SELECT a.buId, sum(a.amount) AS amount, sum(a.reAmount) AS amount1, sum(a.diffAmount) AS diffAmount, sum(rePayment) AS rePayment /*客户欠款*/ , (sum(rePayment) + b.debt_amount) AS rePayment1 /*客户应收余额[+期初欠款]*/ FROM ( SELECT a.amount, a.transType, a.billStatus, b.amount AS reAmount, b.diffAmount, IF ( transType = 150601, ( abs(a.amount) - IFNULL(abs(b.amount), 0) - IFNULL(abs(b.diffAmount), 0) ), - ( abs(a.amount) - IFNULL(abs(b.amount), 0) - IFNULL(abs(b.diffAmount), 0) ) ) rePayment, a.buId FROM t_scm_sa_invoice_0_58 AS a LEFT JOIN ( SELECT sum(amount) amount, sum(diffAmount) AS diffAmount, stlId FROM t_scm_payment_info_26 WHERE isDelete = 0 AND sid = 1338 AND transType IN (150601, 150602) AND billStatus <> 6 GROUP BY stlId ) AS b ON a.id = b.stlId WHERE a.isDelete = 0 AND sid = 1338 AND a.billStatus <> 6 HAVING IFNULL(abs(a.amount), 0) > ( IFNULL(abs(b.amount), 0) + IFNULL(abs(b.diffAmount), 0) ) ) AS a LEFT JOIN t_bs_contact_ext AS b ON a.buId = b.contactId WHERE b.isDelete = 0 GROUP BY buId ) AS b ON b.buId = a.id where a.isDelete = 0 AND a.sid = 1338 AND a.type = - 10 order by b.rePayment1 desc,a.id asc limit 490,10

#51(262 次,最大/平均 22.860/2.589 秒)

SELECT count(1) count from( SELECT a.id, a.iid, a.billNo, a.billType, a.billDate, a.buId, a.invId, a.transTypeName, a.transType, a.price, a.locationId, a.salesId, a.qty, a.amount, a.deduction, a.disAmount, a.allCost, b.name AS invName, b.number AS invNumber, b.spec AS invSpec, b.unitName AS mainUnit, b.brandName, b.skuId, b.minNum, b.packSpec, b.categoryName, b.productCode, c.number AS contactNo, c.name AS contactName, d.name AS locationName, d.locationNo, e.number AS salesNo, e.name AS salesName FROM ( SELECT a.id, a.iid, a.billNo, a.billType, a.billDate, a.buId, a.invId, a.transTypeName, a.transType, a.locationId, a.salesId, a.price, sum(a.qty) AS qty, sum( CASE WHEN a.transType = 150601 THEN abs(a.qty * a.price) ELSE - abs(a.qty * a.price) END ) AS amount, sum( CASE WHEN a.transType = 150601 THEN a.deduction ELSE - a.deduction END ) AS deduction, sum( CASE WHEN a.disAmount = 0 THEN a.amount ELSE a.disAmount END ) AS disAmount, sum( CASE WHEN a.costPrice != 0 THEN - a.costPrice * a.qty WHEN b.price THEN - b.price * a.qty ELSE 0 END ) AS allCost FROM t_scm_sa_invoice_info_0_34 AS a LEFT JOIN (select sid,invId,locationId,price from t_bs_cost_price_day_2 as g inner join ( select max(id) maxId from t_bs_cost_price_day_2 where sid=3618 group by invId,locationId ) h on g.id=h.maxId) AS b ON a.invId = b.invId AND a.locationId = b.locationId AND a.sid = b.sid LEFT JOIN t_scm_sa_invoice_0_34 AS f ON a.iid = f.id AND f.sid = 3618 WHERE 1=1 AND a.isDelete = 0 AND f.billStatus <> 6 and a.billType="SALE" and a.sid = 3618 and f.billStatus < 6 and a.billDate>="2025-09-04" and a.billDate<="2026-09-03" group by a.invId, a.locationId ) AS a LEFT JOIN t_bs_goods AS b ON a.invId = b.id AND b.sid IN (3618, 1) AND b.isDelete = 0 LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.sid = 3618 AND c.isDelete = 0 LEFT JOIN t_bs_storage AS d ON a.locationId = d.id AND d.sid = 3618 AND d.isDelete = 0 LEFT JOIN t_bs_staff AS e ON a.salesId = e.id AND e.sid = 3618 AND e.isDelete = 0 WHERE (1=1) and b.categoryId IN (110092588) ) count

#52(261 次,最大/平均 19.916/4.403 秒)

SELECT count(1) count from( SELECT a.*, b.name AS buName, c.name AS invName,c.brandName,c.spec,c.status, c.number AS invNumber FROM t_scm_offer_order_info AS a LEFT JOIN t_bs_contact AS b ON a.buId = b.id AND b.sid = 2017 AND b.type < 0 LEFT JOIN t_bs_goods AS c ON a.invId = c.id WHERE a.isDelete = 0 and a.sid = 2017 and a.billDate>="2026-08-03" and a.billDate<="2026-09-03" and a.obsolete = 0 ) count

#53(256 次,最大/平均 1.531/1.089 秒)

SELECT a.barCode, a.quantityUM, b.id as invId, b.number, b.brandName, b.skuId, b.status, b. NAME, b.spec, b.productCode, b.categoryName, b.minNum as qty FROM t_bs_goods AS b LEFT JOIN t_bs_goods_barcode AS a ON a.itemCode = b.skuId /* AND b.isDelete = 0*/ WHERE b.sid = 1 /*and a.companyCode = '1001' */ and a.barCode = '6941743525020' HAVING skuId IS NOT NULL

#54(255 次,最大/平均 4.370/1.910 秒)

SELECT `accId`, `billDate`, sum(payment) as payment FROM `t_scm_account_info_0` WHERE `sid` = '3216' AND `isDelete` =0 AND `billDate` < '2026-09-01' GROUP BY `accId`

#55(249 次,最大/平均 4.581/1.845 秒)

select `billNo` from `t_scm_po_order_info_4` where `sid` = 1060 and (`skuId` like '%PR106026080408362896%' or `invName` like '%PR106026080408362896%' or `srcOrderNo` like '%PR106026080408362896%' or `billNo` like '%PR106026080408362896%') and `isDelete` = 0

#56(241 次,最大/平均 61.674/2.717 秒)

SELECT count(1) count from( SELECT a.id, b.billNo as stlNo,b.billDate as stlbillDate,b.amount as totalAmount,b.billStatus as saleSatatus, a.transType,a.amount as thisAmount,a.diffAmount as thisDiffAmount,a.description, IFNULL(c.payAmount,0) AS payAmount,IFNULL(c.diffAmount,0) AS diffAmount FROM t_scm_payment_info_8 AS a LEFT JOIN t_scm_sa_invoice_0_40 AS b ON a.stlId = b.id AND b.sid = 2792 LEFT JOIN ( SELECT SUM(IFNULL(amount, 0)) AS payAmount, SUM(IFNULL(diffAmount, 0)) AS diffAmount, stlId FROM t_scm_payment_info_8 WHERE isDelete = 0 AND billType = "RECEIPT" AND sid = 2792 AND transType IN (150601, 150602) AND billStatus NOT IN (6) GROUP BY stlId ) AS c ON a.stlId = c.stlId WHERE a.isDelete = 0 AND a.billType = "RECEIPT" and a.sid = 2792 AND b.billStatus NOT IN (6) and a.iid = 936104752041689088 ) count

#57(236 次,最大/平均 22.931/2.591 秒)

SELECT a.id, a.iid, a.billNo, a.billType, a.billDate, a.buId, a.invId, a.transTypeName, a.transType, a.price, a.locationId, a.salesId, a.qty, a.amount, a.deduction, a.disAmount, a.allCost, b.name AS invName, b.number AS invNumber, b.spec AS invSpec, b.unitName AS mainUnit, b.brandName, b.skuId, b.minNum, b.packSpec, b.categoryName, b.productCode, c.number AS contactNo, c.name AS contactName, d.name AS locationName, d.locationNo, e.number AS salesNo, e.name AS salesName FROM ( SELECT a.id, a.iid, a.billNo, a.billType, a.billDate, a.buId, a.invId, a.transTypeName, a.transType, a.locationId, a.salesId, a.price, sum(a.qty) AS qty, sum( CASE WHEN a.transType = 150601 THEN abs(a.qty * a.price) ELSE - abs(a.qty * a.price) END ) AS amount, sum( CASE WHEN a.transType = 150601 THEN a.deduction ELSE - a.deduction END ) AS deduction, sum( CASE WHEN a.disAmount = 0 THEN a.amount ELSE a.disAmount END ) AS disAmount, sum( CASE WHEN a.costPrice != 0 THEN - a.costPrice * a.qty WHEN b.price THEN - b.price * a.qty ELSE 0 END ) AS allCost FROM t_scm_sa_invoice_info_0_34 AS a LEFT JOIN (select sid,invId,locationId,price from t_bs_cost_price_day_2 as g inner join ( select max(id) maxId from t_bs_cost_price_day_2 where sid=3618 group by invId,locationId ) h on g.id=h.maxId) AS b ON a.invId = b.invId AND a.locationId = b.locationId AND a.sid = b.sid LEFT JOIN t_scm_sa_invoice_0_34 AS f ON a.iid = f.id AND f.sid = 3618 WHERE 1=1 AND a.isDelete = 0 AND f.billStatus <> 6 and a.billType="SALE" and a.sid = 3618 and f.billStatus < 6 and a.billDate>="2025-09-04" and a.billDate<="2026-09-03" group by a.invId,a.locationId ) AS a LEFT JOIN t_bs_goods AS b ON a.invId = b.id AND b.sid IN (3618, 1) AND b.isDelete = 0 LEFT JOIN t_bs_contact AS c ON a.buId = c.id AND c.sid = 3618 AND c.isDelete = 0 LEFT JOIN t_bs_storage AS d ON a.locationId = d.id AND d.sid = 3618 AND d.isDelete = 0 LEFT JOIN t_bs_staff AS e ON a.salesId = e.id AND e.sid = 3618 AND e.isDelete = 0 WHERE (1=1) and b.categoryId IN (110092588)

#58(236 次,最大/平均 37.254/9.640 秒)

SELECT COUNT(*) AS `numrows` FROM `t_scm_sa_order_2` WHERE `billType` = 'SALE' AND `transType` = '170502' AND `sid` = '1058' AND `billStatus` IN (0, 1, 2) AND `isDelete` =0 AND ( `billNo` LIKE '%XD1058202609030006%' ESCAPE '!' OR `description` LIKE '%XD1058202609030006%' ESCAPE '!' )

#59(219 次,最大/平均 27.382/2.361 秒)

SELECT a.id, b.billNo as stlNo,b.billDate as stlbillDate,b.amount as totalAmount,b.billStatus as saleSatatus, a.transType,a.amount as thisAmount,a.diffAmount as thisDiffAmount,a.description, IFNULL(c.payAmount,0) AS payAmount,IFNULL(c.diffAmount,0) AS diffAmount FROM t_scm_payment_info_8 AS a LEFT JOIN t_scm_sa_invoice_0_40 AS b ON a.stlId = b.id AND b.sid = 2792 LEFT JOIN ( SELECT SUM(IFNULL(amount, 0)) AS payAmount, SUM(IFNULL(diffAmount, 0)) AS diffAmount, stlId FROM t_scm_payment_info_8 WHERE isDelete = 0 AND billType = "RECEIPT" AND sid = 2792 AND transType IN (150601, 150602) AND billStatus NOT IN (6) GROUP BY stlId ) AS c ON a.stlId = c.stlId WHERE a.isDelete = 0 AND a.billType = "RECEIPT" and a.sid = 2792 AND b.billStatus NOT IN (6) and a.iid = 936104752041689088 order by a.id desc limit 0,200

#60(213 次,最大/平均 2.082/1.451 秒)

SELECT q.sid,COUNT(*) matched,SUM(CASE WHEN q.guide_plan_id=0 THEN 1 ELSE 0 END) no_plan,SUM(CASE WHEN q.guide_plan_id=0 AND (q.low_price<>CAST(TRUNCATE(g.lowPrice * 100, 0) AS SIGNED) OR q.guide_price<>CAST(TRUNCATE(g.lowPrice * 100, 0) AS SIGNED)) THEN 1 ELSE 0 END) no_plan_mismatch,SUM(CASE WHEN q.guide_plan_id>0 AND q.low_price<>CAST(TRUNCATE(g.lowPrice * 100, 0) AS SIGNED) THEN 1 ELSE 0 END) plan_low_mismatch,SUM(CASE WHEN q.guide_plan_id>0 AND q.guide_price<>CAST(TRUNCATE(g.lowPrice * 100, 0) AS SIGNED) THEN 1 ELSE 0 END) plan_guide_mismatch FROM t_quote_goods_base_53 q INNER JOIN t_bs_goods g ON g.id=q.inv_id WHERE q.sid IN (2677,2805,2869,2933,2997,3061,3125,3253,3317,3381) AND q.inv_id IN (/* 原始 SQL 已读取;此处折叠 1898 个参数 */) AND g.sid=1 AND g.isDelete=0 AND g.modifyTime >= '2026-09-01 00:00:01' AND g.modifyTime <= '2026-09-01 00:05:01' GROUP BY q.sid

#61(201 次,最大/平均 2.955/1.948 秒)

select count(*) as aggregate from `kxj_repair_depot` inner join (select DISTINCT depot_id from `kxj_user_depot_relation` where `status` = 1 and `switch_time` != '') as `l` on `kxj_repair_depot`.`id` = `l`.`depot_id` where `status` IN (1, 0) and `province` = '520000' and `city` = '522600' and `area` = '522626'

3.6 “具体 SQL”完整度核对结论

本次重新进入用户提供的 DAS 链接后,页面显示窗口为 2026-09-02 07:40:00~13:40:00。通过页面 DOM 实际读取到第 1 页 50 条和第 2 页前 11 条的 SQL 单元格,证据不是根据表名或 SQL 指纹推测出来的。

核对结果如下:

范围页面原文情况文档处理
61 条中的 53 条SELECT、表名、连接、过滤、聚合、排序和分页均能从页面单元格读到结尾第 3.5 节保留具体 SQL 结构
#2、#3、#8、#11、#35、#43、#60页面能读到完整语句,但包含较长客户/商品/订单 IN 参数文档只折叠参数值,保留谓词、表、JOIN、聚合和分页结构
#7页面单元格自身在约 16,158 个字符处以 ... 结束明确标记为 DAS 原文截断,未猜测缺失后半段

因此,当前文档已经不是“只有指纹”,但也不能表述为“61 条全部是可直接执行的完整 SQL”。要得到 #7 的完整原文,以及所有长 IN 的完整参数,仍需从 DAS 的详情复制/导出通道或应用/数据库审计日志取得;仅凭当前列表页不能补齐。

4. 业务链路与代码入口

4.1 应收、客户授信和付款

业务目的:销售开单、销售出库或收款相关页面需要知道客户销售金额、已收金额、折让、历史欠款和授信余额。

当前入口:

入口代码路径关键方法最终展示/使用
销售开单/出库客户账户application/service/scm/ReceiptService.phpgetCustomerAccount() → getCreditByBuId()rePayment、credit、credit_vacancy
客户应收余额application/models/bs/ContactModel.phpreceivableBalance()销售授信计算
客户/供应商账款列表application/models/report/ReportModel.phpget_contact2() → splitContact2()客户余额、采购欠款、销售欠款
本期应收报表application/models/report/ReportModel.phpgetpAmount()客户销售额、收款额、折让
对账单application/service/scm/ReportService.php进入 InvSaModel::querySaleInvoiceStatement()对账单订单和收款明细

慢的本质: 外层最终只需要客户汇总或一个余额,但付款子查询经常先按整个分表的 stlId 聚合,再与销售单连接;若没有先把客户筛选出的销售单 ID传给付款查询,就会形成很大的派生表。应收余额还存在“销售单明细返回给 PHP”的历史实现和“数据库聚合”的当前实现两套版本风险。

重要代码事实核对: 当前工作区 staging 分支的 ContactModel::receivableBalance()(约 384 行)仍是单条聚合 SQL,并在会话中调整临时表大小;git log 显示来自 20244282ce 和 96d888caf7。活动任务索引中“已回退到旧版两条 SQL”的文字与当前文件不一致,应以当前文件和目标部署版本为准,发布前必须核对线上 SHA。

优化难度:高。 金额结果必须覆盖销售、销退、负数付款、折让、超收、撤销和历史补录。推荐顺序是:

  1. 用同一 REPEATABLE READ 快照对比旧 PHP 口径与新 SQL 口径;
  2. 先把外层客户筛选结果变成销售单 ID集合,再聚合付款;
  3. 若仍慢,按 ID范围或临时 ID表拆分,但每段只返回一行金额;
  4. 中长期维护 sid + buId 应收汇总表,在销售、收款、退款、折让和撤销事件成功后更新。

禁止直接做的事: 不要只把 LEFT JOIN 改成 INNER JOIN,不要把 billStatus <> 6 随意改成 billStatus < 6,不要因为一个负数付款样本就改变正负号公式,也不要在没有结果集对比时上线新口径。

4.2 最近销售价

业务场景:销售下单、报价、导入出库单、移动商城或智能询价展示客户最近成交价。

代码链路: InventoryService::getRecentSalePrice()/getRecentSalePrice_new() → SaInvoiceInfoModel::getRecentSalePrice();报价流程还从 QuoteManagerBaseSer::getRecentSalePrices() 进入;批量导入在 application/Services/Import/Type/SaleOutGoodsService.php 使用。

当前代码通过 MAX(id) 取得销售明细最新记录,并通过 activityId=0 排除活动价;旧 SQL 指纹中还出现过 GROUP_CONCAT(... ORDER BY createTime DESC) 和关联销售单主表的写法。不能直接把最大 ID当作最新时间,应验证 ID 与业务时间是否始终单调,并用“业务时间 + 同时间最大 ID”确定唯一最新行。

低风险动作是明确字段、去掉 SELECT *、去掉无用派生表、去重 invIds、对单批和批量统一入口。高风险点是活动价排除条件、客户维度、历史数据缺少 activityId 的兼容性。

4.3 成本价

业务场景:销售出库、销售退货、盘点、调拨、库存报表和利润计算需要按 invId + locationId 得到指定日期前最新成本价。

代码链路: application/models/bs/CostPriceModel.php::getCostPrices();调用方包括 SaOrderSer、NormalSaleSer、Price/GetPrice.php、PDA/GPDA 盘点、调拨和多个报表服务。

当前分表按 sid % BS_COST_PRICE_DAY_NUM 选择。方法在进入最新记录查询前会构造 sid、商品集合、货位、日期/版本条件;超过 1000 个商品会拆成多个 IN 条件。页面慢点表现为扫描最多 656.81K 行,说明大批量商品和历史日期范围放大了查询。

建议先验证按 (invId, locationId) 取 MAX(id) 后回表取 price,并保留现有日期/版本条件;再比较 FORCE INDEX(UK_SILI) 与优化器自主选索引的计划。验收必须逐商品、逐货位对比价格和空值行为,不能只比较返回行数。

4.4 商品条码与 PDA

业务场景:PDA 扫码、盘点和手工选择商品时,通过条码或物料编码找到商品主档,再查询库存和货位。

代码链路: application/models/Data_model_app.php::getPdaSkusByBarcode() → application/Services/Pda/TakeStockSer.php::getScanData()。

当前 SQL 从 t_bs_goods 左连接 t_bs_goods_barcode,按条码或 itemCode过滤,按 itemCode 分组并用 GROUP_CONCAT拼条码。这里有三个不能混用的入口:条码扫描、物料编码精确匹配、手工指定 inv_id。只针对条码查询时可以评估以条码表为驱动的内连接;但不能用同一个改写覆盖手工选品路径,也不能无证据删除 GROUP BY/HAVING。

优先验证条码表 itemCode/barcode 索引、商品表 sid/id/skuId索引和条码重复数据。结果对比必须包含商品数量、主条码、条码拼接值、排序和无匹配时的返回。

4.5 销售单列表、详情、COUNT 和对账单

业务场景:出库列表、销售单详情、客户对账单和销售报表展示订单主信息、客户、销售员、门店、收款、来源订单以及分页总数。

代码链路:

场景代码
销售单详情application/service/scm/InvSaService.php 调用 InvSaModel::querySaleInvoice()
出库列表InvSaService::outBoundList() 先调用 getOutBoundList($where, 3) 做 COUNT,再调用同方法取列表
客户对账单InvSaModel::querySaleInvoiceStatement(),由 ReportService/StatementSer 调用
销售明细InvSaModel::querySaleInvoiceInfo()/querySaleInvoiceInfoStatement()

querySaleInvoice() 目前 SELECT a.*,同时连接客户、客户扩展、付款聚合、员工、账户、门店和销售订单。即使外层最终只返回一个详情行,付款派生表也可能先按整个付款分表 GROUP BY stlId,造成百万级扫描。列表则有“先 COUNT 再查当前页”的固定放大。

推荐先按主表条件定位当前页或详情 ID,再按这些 ID 查询付款和扩展信息;对于总页数,如果产品只需要“是否有下一页”,可以用 rows + 1,如果必须展示精确页数则评估短缓存或统计快照。任何 COUNT 改造都要核对筛选条件、状态边界、排序和权限过滤。

4.6 采购订单、采购发票和账户流水

采购订单代码链路: PoOrderInfoSer::getPageList() → PoOrderInfoModel::getPageList(),当前明细查询按 sid + iid + isDelete 过滤,同时对商品名做模糊搜索,并单独 COUNT。

采购发票/付款报表代码链路: ReportModel::splitContact2() 中采购单据和采购付款汇总;ReportService 的采购报表方法继续拼接客户和时间条件。

账户流水代码链路: application/models/Data_model.php::get_account_info(),按 sid % SCM_ACCOUNT_SUB_NUM选择分表,连接客户、收支分类、账户和付款信息。

这些查询的共同风险是把列表字段、汇总字段和关联表字段混在一起,并在大集合上 GROUP BY。建议按页面拆出“主单列表”“汇总金额”“详情扩展”三类查询,明确每条查询只返回所需字段。采购金额、付款和账户流水也属于财务口径,必须用固定单据集合核对总额。

4.7 机器人会话与会话记录

业务场景:机器人统计页面按会话、会话记录、微信昵称、文本或服务站筛选并展示会话链路;部分任务会按 ID范围批量读取历史数据。

代码链路: application/controllers/RobotStat.php、RobotStatV2.php → ConversationModel、ConversationRecordModel;表包括 t_scm_robot_conversation、t_scm_robot_conversation_record 和历史表。

排名 31、42、44、47 的共同特点是扫描/返回行大,尤其 ID范围读取平均返回接近百万行。此类问题不能只建索引:如果业务真的要搬运大量会话,就需要游标分页、时间范围、字段投影或异步导出;如果页面只显示最近一页,应检查是否错误地先读全量再在 PHP 截断。

修改风险在于统计口径和会话完整性:需要保证按 cv_id 的记录顺序、首条消息判断、过滤特殊服务站和模糊搜索结果不变。建议先采集实际页面需要的字段,再限制查询列。

4.8 调拨申请

StfApplyModel::getPageList() 同时支持申请方和发货方:当不是特定类型时使用 apply_sid = ? OR deliver_sid = ?;还支持单号精确集合和 %keyword% 模糊查询,并先 COUNT 后分页。当前 SQL 最高扫描 1.71M 行。

候选方案是将申请方和发货方拆成两个索引可用的分支后 UNION ALL,再按主键去重;但必须先确认同一申请单可能同时满足两个角色,不能直接 UNION ALL 导致重复。另一个低风险动作是当用户没有输入搜索词时不要拼接 LIKE '%%',并评估是否可用游标分页。

4.9 报价基础数据和价格变更日志

报价基础数据来自 QuoteGoodsBaseModel 及报价任务;价格变更日志来自 QuotePriceChangeLogModel::getBatchUpdateList(),由 QuoteManagerBaseSer::handlePriceChange() 分批读取 1000 条后按服务站处理并批量更新状态。

价格变更查询的过滤字段固定为 change_type、bill_date、version、status,但当前代码使用 mix_where() 后没有指定列,也没有明确排序。可先做 SELECT 列收敛、按主键游标读取和联合索引评估;必须确认处理失败重跑、批次边界和状态更新幂等。

4.10 t_sale_order / t_sale_order_detail 族(兄弟服务)

这两张表不属于当前 DGJ2 主仓库的模型。已在 www/saas 定位到 SaleOrder、SaleOrderDetail、SaleOrderRepository::search() 和两个搜索服务入口:服务端将销售订单主表和明细表按 order_id 关联,并按 contact_id/status/create_time/sku_id 筛选后分页。DAS 中的 ID 范围读取、明细 ID 范围读取和订单号 LIKE 不能仅凭表名改 DGJ2;应先确认实际部署服务、SQL 完整条件、索引和调用页面,再安排高风险改造。

4.11 生产日志核查边界

在 2026-09-02 07:40~13:40 的精确生产日志窗口内,组合检索 receivableBalance + t_scm_sa_invoice_0_10、getCustomerAccount + t_scm_sa_invoice_0_10、querySaleInvoice + t_scm_sa_invoice、getBatchUpdateList + t_price_change_log、getCostPrices + t_bs_cost_price_day 均没有命中。应用日志通常不记录完整 SQL 或方法名,所以这只能作为“未找到可直接关联的日志”证据,不能作为“没有接口调用”的结论。

5. 每个业务族的“为什么慢、先怎么改、风险是什么”

业务族为什么慢低风险优化主要风险验收证据
应收/付款付款先全量按 stlId 分组;金额条件和撤销口径复杂先筛客户销售单 ID;付款只按这些 ID聚合;结果只返回汇总金额正负号、销退、折让、超收和撤销口径改变固定单据集旧 PHP vs 新 SQL 的逐单和总额一致
最近价大 IN、最新行计算和活动价排除混在一起商品去重;字段收敛;时间+ID取唯一最新把活动价或历史缺失活动 ID的记录误纳入每个 invId 的旧/新价格和来源明细
成本价日期范围大、商品批量大,历史实现可能先 COUNT再排序MAX(id)候选;保留分表、日期、货位条件日期/版本语义和同日多记录(invId,locationId) 全量集合对比
销售单详情SELECT * + 多个扩展 JOIN;付款派生表先聚合主单 ID驱动;付款按主单 ID查询;明确列详情字段缺失、付款状态不全页面字段逐项、付款金额和 SQL 计划
列表 COUNTCOUNT 和列表扫描相同集合两次rows+1或短缓存;游标分页页数显示变化、筛选边界变化第1页/中间页/末页记录数和总页数
采购报表客户、采购单、付款和发票多层汇总拆主单、付款、汇总查询;缩短客户集合期初、退货和付款负数口径客户/期间/单据类型总额核对
条码左连接、分组、条码拼接;模糊查询可能扫大量商品条码入口单独内连接;加精确字段条件条码重复、物料编码和手工选品语义输入条码/编码/无匹配/重复条码用例
机器人会话批量返回本身太大,PHP搬运和排序消耗时间/游标分页、字段投影、异步统计会话顺序、首条消息和历史完整性同一条件记录数、顺序、字段完整性
调拨/报价OR、LIKE '%%'、COUNT+列表重复条件分支、主键游标、明确字段和顺序角色重复、批次重跑、状态幂等角色交集、关键词、重复执行回归

6. 建议的落地顺序

第一阶段:不改业务口径,做低风险 SQL/调用治理

  1. 价格变更日志:明确列、主键游标、目标索引 EXPLAIN。
  2. 成本价:删除重复 COUNT 的候选实现,比较 MAX(id) 回表方案,先在预发验证。
  3. 条码:将扫码精确查询和手工选品查询分开,避免一个 SQL 兼容所有语义。
  4. 列表分页:统计确实需要总页数的页面,避免无意义的 COUNT;对可行页面用 rows+1。
  5. 调拨申请:确认申请方/发货方交集后,再评估 UNION 分支。

第二阶段:销售/采购列表与付款派生表改造

  1. 详情查询先取主单,再查询付款和扩展信息;避免为一行详情先聚合整张付款表。
  2. 列表查询只查当前页主单 ID,再批量查询客户、付款、门店和员工信息。
  3. 报表查询按客户集合或单据集合限制付款聚合,禁止付款子查询无边界地按全表 stlId 分组。
  4. 所有 SELECT * 改为页面实际需要的列,并给每个大查询保留 SQL 计时日志。

第三阶段:应收汇总与机器人批处理

  1. 应收先完成固定单据集的结果一致性验证,再决定是否继续使用单条聚合、ID范围分段或汇总表。
  2. 应收接口增加请求级/短 TTL 缓存时,缓存键必须包含 sid + buId,并明确收款、退款、撤销后的失效策略。
  3. 机器人统计改为按时间/ID游标读取,默认限制字段,导出任务异步化。
  4. t_sale_order 相关 SQL 先完成兄弟服务定位,不能在 DGJ2 中凭表名推断入口。

7. 验收与回滚

7.1 每条 SQL 必须记录的性能数据

  • 冷/热缓存分别记录,不能只拿第二次执行时间当作真实耗时。
  • 使用同一参数、同一时间窗口和同一数据快照。
  • 记录总墙钟时间、每条 SQL 时间、扫描行、返回行、临时表磁盘溢出和执行计划。
  • 并发验证至少记录 P50/P95/P99;DAS 单次样本不能替代高并发结论。
  • 结果正确性与性能是两个独立门槛,不能因为耗时下降就跳过金额和页面回归。

7.2 通用结果对比

-- 生产只读验证示例:先在目标库确认分表、索引和执行计划
EXPLAIN <old_sql>;
EXPLAIN <candidate_sql>;

-- 结果对比时使用同一参数和同一 REPEATABLE READ 快照
-- 列表类:按主键排序后做集合差异
-- 金额类:按 sid、buId、单据ID分别比对 decimal 值
-- 最新价/成本价:按 invId、locationId 比对来源记录和 price

7.3 回滚方式

变更类型回滚
只改 SQL 语句恢复旧 SQL 版本,保留新旧结果对比日志
新增索引先记录原索引和执行计划;回滚前评估并发与锁,生产删除索引需单独审批
改分页/调用次数保留旧入口开关或可回退版本,比较页面记录数和接口耗时
应收汇总/缓存先关闭读缓存或切回实时计算,再核对汇总表与明细差异
机器人异步化保留同步只读查询作为故障兜底,确认导出任务失败可重试

8. 当前待补证据

  1. 阿里云 RAM 登录后重新读取 DAS 详情页,补齐当前 200 条明细中的 51~200 条;若页面仍不刷新,使用 DAS 导出任务或其接口获取完整结果,但创建导出任务前需单独确认。
  2. 针对每个高频表分表执行 SHOW CREATE TABLE、SHOW INDEX 和 EXPLAIN;当前稿没有把本地 schema 或历史下载文件当成生产证据。
  3. 对排名 14、15、34、45 的 t_sale_order 族 SQL,确认实际服务、代码仓库、环境和调用入口。
  4. 对排名 37、40、48 及采购发票 SQL,使用完整 SQL 文本补齐物理表、过滤条件和调用者。
  5. 核对线上部署 SHA,尤其是 ContactModel::receivableBalance() 当前聚合版本与历史任务索引描述不一致的问题。

8.1 2026-09-04 复核结果

  • 用户已将 DAS 详情页切到前台并确认页面加载完成;本轮浏览器只读读取仍在 DAS 页面/内嵌内容处超时,未能形成可复核的 51~200 条数据,因此本稿仍只对前 50 条作逐条结论。
  • 旧 Confluence 页面《站管家 MySQL 慢查询优化:前后对比与验收》已通过 REST 只读读取确认:空间为“开发中心”(kzPlatform),父页面为《线上慢SQL》(页面 ID 22481697),旧页面 ID 73510965、版本 9。
  • 目标标题《站管家 2026-09-02 DAS 剩余慢查询分析与优化排期》在同一空间下暂无重复页面。创建新页面前应再次确认;创建后必须回读标题、父页面、版本和正文。
发布前说明:本稿当前可以作为“前 50 条已确认慢查询 + 业务族优化排期”使用;在 RAM 登录并补读 51~200 条之前,不应对外宣称已覆盖 DAS 的 686 个模板。

9. 代码证据索引

  • application/models/bs/ContactModel.php::receivableBalance()
  • application/models/report/ReportModel.php::splitContact2()、getpAmount()
  • application/models/scm/InvSaModel.php::querySaleInvoice()、querySaleInvoiceStatement()、getOutBoundList()
  • application/service/scm/InvSaService.php::outBoundList()
  • application/service/scm/ReceiptService.php::getCustomerAccount()、getCreditByBuId()
  • application/models/saOrders/SaInvoiceInfoModel.php::getRecentSalePrice()
  • application/models/saOrders/SaOrderInfoModel.php::getRecentSalePrice()
  • application/models/bs/CostPriceModel.php::getCostPrices()
  • application/models/Data_model_app.php::getPdaSkusByBarcode()
  • application/models/stf/StfApplyModel.php::getPageList()
  • application/models/orders/PoOrderInfoModel.php::getPageList()
  • application/models/bs/QuotePriceChangeLogModel.php::getBatchUpdateList()
  • application/Services/BaseData/QuoteManagerBaseSer.php::handlePriceChange()
  • application/models/Data_model.php::get_account_info()
  • application/models/moveMall/ConversationModel.php、ConversationRecordModel.php
  • application/controllers/RobotStat.php、RobotStatV2.php