You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日历事件模块数据加载速度过慢的修复方案咨询

日历事件模块加载慢问题优化方案

问题背景

日历事件模块加载耗时约10秒,尝试关闭待处理订单数量为0的显示后问题仍未解决,询问是否可通过忽略无待处理订单的日期逻辑来修复。

当前查询代码

query = String.Format("SELECT COUNT(*) FROM `orders_list` WHERE `Ordered_Date` = '{0}' AND `Status` = 'For Delivery'", Program.stcYear + "-" + Program.stcMonth + "-" + lblDay.Text);
Program.ExecuteCommand(query);
if (Program.reader.Read())
{
    int count = Convert.ToInt32(Program.reader.GetString(0));
    if(count >= 1)
    {
        lblPendings.Text = "Pending: " + count;
    }
}
Program.CloseConnections();

核心问题与优化方案

核心原因

当前代码大概率是针对日历中每个日期单独执行一次查询(比如遍历一个月30天就发30次请求),频繁的数据库交互是加载慢的主要原因,和是否隐藏0数量显示无关。

具体优化步骤

  1. 批量查询替代循环单查
    一次性查询当前月份所有有待处理订单的日期及对应数量,减少数据库请求次数:

    // 批量获取当月所有有效订单的日期和数量
    string query = $"SELECT Ordered_Date, COUNT(*) FROM `orders_list` WHERE Ordered_Date BETWEEN '{Program.stcYear}-{Program.stcMonth}-01' AND '{Program.stcYear}-{Program.stcMonth}-31' AND `Status` = 'For Delivery' GROUP BY Ordered_Date";
    Program.ExecuteCommand(query);
    
    // 把结果存入字典,方便后续快速查询
    Dictionary<string, int> pendingDateCounts = new Dictionary<string, int>();
    while (Program.reader.Read())
    {
        string targetDate = Program.reader.GetString(0);
        int orderCount = Program.reader.GetInt32(1);
        pendingDateCounts[targetDate] = orderCount;
    }
    Program.CloseConnections();
    
    // 遍历日历日期时直接从字典取值
    string currentDate = $"{Program.stcYear}-{Program.stcMonth}-{lblDay.Text}";
    if (pendingDateCounts.TryGetValue(currentDate, out int count) && count >= 1)
    {
        lblPendings.Text = $"Pending: {count}";
    }
    
  2. 添加联合索引加速查询
    在数据库中为orders_list表创建Ordered_Date和Status的联合索引,大幅提升查询效率:

    CREATE INDEX idx_ordered_date_status ON orders_list(Ordered_Date, Status);
    
  3. 修复SQL注入漏洞
    原代码用String.Format拼接SQL存在安全风险,改成参数化查询(需根据Program类的参数传递方式调整):

    // 参数化查询示例(单日期场景)
    string query = "SELECT COUNT(*) FROM `orders_list` WHERE `Ordered_Date` = @targetDate AND `Status` = 'For Delivery'";
    // 假设Program支持添加参数的方法
    // Program.AddParameter("@targetDate", $"{Program.stcYear}-{Program.stcMonth}-{lblDay.Text}");
    // Program.ExecuteCommand(query);
    

内容的提问来源于stack exchange,提问作者Diaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:05:22