记一次数据查询优化
某天搬砖搬得热火朝天,突然一个电话打来,业务部门反映,某功能特别卡,简直不能忍。有多慢?大概90s。是突然很慢?还是之前就很慢?之前就有点慢,但是没有这么慢。好了,不扯犊子了,直接查看源码:
public DataSet GetStockByUserAndTime(string warehouseID, string userID, int minutes) { SqlItem sqlItem = new SqlItem(); var searchTime = DateTime.Now.AddMinutes(0 - minutes); sqlItem.SqlStr = @" select t.manifest_no from STOCK_IN_OUT t where t.update_time >:searchTime and t.update_user=:userID and t.warehouse_id = :warehouseID and t.action_type = 0 "; sqlItem.AppendParameter("searchTime", searchTime); sqlItem.AppendParameter("userID", userID); sqlItem.AppendParameter("warehouseID", warehouseID); return GetDataSet(sqlItem); }
- 可以看出总共才一个表,用pl/sq查看一下表,发现改表数据量很大,每天都要新增10几万条数据,并且update_time字段没有创建索引,所以初步判断是未创建索引导致,急忙联系一下数据库小组,给我某库的STOCK_IN_OUT表加个索引呗?,加完了索引,居然还是慢,到底什么导致的?
- 会不会是网络传输慢,但是其它类似的方法依然很快,所以排除。
- 是不是日期格式原因导致的?原传入“searchTime”参数直接是日期格式,而不是string类型,故可以将日期格式转换成string类型传入,在sql语句里面再转换成日期格式,改成如下
public DataSet GetStockByUserAndTime(string warehouseID, string userID, int minutes) { SqlItem sqlItem = new SqlItem(); var searchTime = DateTime.Now.AddMinutes(0 - minutes).ToString("yyyy-MM-dd HH:mm:ss"); sqlItem.SqlStr = @" select t.manifest_no from STOCK_IN_OUT t where t.update_time >to_date(:searchTime,'yyyy-mm-dd hh24:mi:ss') and t.update_user=:userID and t.warehouse_id = :warehouseID and t.action_type = 0 "; sqlItem.AppendParameter("searchTime", searchTime); sqlItem.AppendParameter("userID", userID); sqlItem.AppendParameter("warehouseID", warehouseID); return GetDataSet(sqlItem); }
调试了一下,只用了223ms,果然是日期格式的原因。
之前为什么没有出现这个问题,和数据库小组沟通,数据库小组:在日期转换的时候,尽量传入string类型,在sql语句里面转换,可能是oralce升级,驱动原因导致的。我:恩,这个锅应该让驱动来背。总之,日期格式要留意啊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?