記一次數據查詢優化
阿新 • • 發佈:2017-09-15
etime cnblogs 排除 ron sel sele dmi 一個表 依然
某天搬磚搬得熱火朝天,突然一個電話打來,業務部門反映,某功能特別卡,簡直不能忍。有多慢?大概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升級,驅動原因導致的。我:恩,這個鍋應該讓驅動來背。總之,日期格式要留意啊。
記一次數據查詢優化