弹框查询慢优化

工作笔记 工作记录
📅 2026-03-20 11:36 👤 admin

一、当前已改的代码
1. 去掉了 Page_Load 的重复绑定
文件:DMS\OrderInfoMnangerment\OrderInfo\UT_ProductListSelect.aspx.cs
你现在的 InitializeComponent() 里已经把这句注释掉了:
•    this.Load += new System.EventHandler(this.Page_Load);
作用:
•    避免首次打开弹窗时 Page_Load 被重复触发
•    避免 !IsPostBack 里的 ucCustomPaging.LoadData(...) 被多执行一次
---
2. 去掉了 btnQuery 的重复绑定
文件:DMS\OrderInfoMnangerment\OrderInfo\UT_ProductListSelect.aspx.cs
AppendServerEvents() 里原来有两次:
•    this.btnQuery.ButtonClick += ...
现在保留了一次,另一处已注释。
作用:
•    点击“查询”按钮时,避免 btnQuery_ButtonClick() 触发两次
•    避免 GetMyProductInfoList() 被重复调用
---
3. 优化了 GetFilter() 的 SQL 条件拼接
文件:DMS\OrderInfoMnangerment\OrderInfo\UT_ProductListSelect.aspx.cs
这部分是本次真正落地的主要 SQL 优化。
3.1 SSO_SameLotInfo
从:
•    FK_SSO_ProductCategoryID in (...)
改成:
•    exists(select 1 ...)
作用:
•    减少大表 in 子查询带来的额外代价
3.2 UT_OrderDetailInfo
从:
•    ut_product.pkid not in (...)
改成:
•    not exists(select 1 ...)
作用:
•    避免 not in 的执行问题和 NULL 风险
•    更利于索引使用
3.3 SOI_ProductStockAdjust
从:
•    对 StartTime / EndTime 做 CONVERT(...)
改成:
•    StartTime < tomorrowStart
•    EndTime >= todayStart
并且整体改成:
•    not exists(...)
作用:
•    去掉对列的函数转换
•    提升日期范围条件走索引的概率
3.4 FCN_Product
从:
•    CONVERT(nvarchar(10), BuyStartTime, 120) > ...
改成:
•    BuyStartTime >= tomorrowStart
作用:
•    日期字段可走索引
3.5 OPF_ProductSettingRecord + AllowOrderChoose
从:
•    月份比较 CONVERT(nvarchar(7), ...)
•    日期比较 CONVERT(varchar(100), ...)
改成:
•    BeginDate < nextMonthStart
•    EndDate >= monthStart
•    AllowOrderChoose 也改成日期范围比较
作用:
•    去掉月份/日期字符串转换
•    更适合索引
3.6 SOI_ShipToProductPurchase
从:
•    先调用 getShiptoIDCount() 额外查一次
•    再决定是否拼 in (...)
改成:
•    直接一条相关条件:
•    not exists(...) or exists(...)
作用:
•    少一次额外预查询
•    逻辑合并到主 SQL 中
---
二、你当前代码里“虽然没改,但已确认的问题”
1. 弹窗初次打开时多次查询的原因
已确认来源有两个:
•    Page_Load 重复绑定
•    btnQuery 重复绑定
你现在这两个点都已经处理掉了。
2. ucCustomPaging.LoadData(this.GetLastPageNumber(...))
这个仍然保留。
它可能导致:
•    首次打开恢复到旧页码
•    如果旧页码大于总页数,分页控件内部可能再补查一次
这个点还没改。
---
三、已给出但还没正式落地到代码的改动
1. BusinessRule.UT_OrderInfo.GetMyProductInfoList()
文件:..\BusinessRule\OrderInfo\UT_OrderInfo.cs
建议方案已给出,但你还没正式应用到代码里。
核心思路是:
•    删除 subfilter 里重复加的 UT_DealerNetPrice 相关条件
•    把 UT_DealerNetPrice 从“where 过滤”改成“带条件的 inner join”
•    删掉无用的 DOH_ProductLimit join
目的:
•    避免价格表重复过滤
•    尽早缩小结果集
•    让执行计划更清晰
---
四、数据库侧已给出的优化建议
1. 已给出索引创建 SQL
已给出这些表的索引脚本:
•    UT_DealerNetPrice
•    SOI_SDDealerDetails
•    SSO_SameLotInfo
•    UT_OrderDetailInfo
•    SOI_ProductStockAdjust
•    SOI_ProductStockAdjustDetail
•    FCN_Product
•    OPF_ProductSettingRecord
•    AllowOrderChoose
•    SOI_ShipToProductPurchase
•    UT_Product
2. 已给出索引删除 SQL
用于回滚测试。
---
五、目前结论
这次优化的结果可以概括成:
已落地
•    去掉重复事件绑定
•    优化 GetFilter() 里的 in/not in
•    去掉日期字段上的 CONVERT
•    减少一次额外 ShipTo 预查询
未落地但已准备好
•    GetMyProductInfoList() 的 join 改造
•    数据库索引落库执行