某天搬磚搬得熱火朝天,突然一個電話打來,業務部門反映,某功能特別卡,簡直不能忍。有多慢?大概90s。是突然很慢?還是之前就很慢?之前就有點慢,但是沒有這麼慢。好了,不扯犢子了,直接查看源碼: 調試了一下,只用了223ms,果然是日期格式的原因。 之前為什麼沒有出現這個問題,和資料庫小組溝通,資料庫小 ...
某天搬磚搬得熱火朝天,突然一個電話打來,業務部門反映,某功能特別卡,簡直不能忍。有多慢?大概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升級,驅動原因導致的。我:恩,這個鍋應該讓驅動來背。總之,日期格式要留意啊。