今天SqlServer數據庫出現了訪問不通的情況,抓緊重啟了下服務,讓大家先恢復使用,然后我開了 SQL Server Profiler 看看是不是存在性能問題SQL,然后就發現一批這樣的SQL,看reads到了6萬、2萬的級別,這個SQL查詢的結果也就幾條,這reads明顯存在問題
把SQL改寫下試試,
可以看到,SQL很快的,reads在個位數,確認存在問題無疑。
上面自動生成的SQL與改寫的SQL對比,可以看到寫法最大的區別就是 exec sp_executesql ,初步懷疑是這個引起的問題。
找到代碼所在行,上面的SQL是使用的SqlSugar生成的代碼
List<Log_hh_god> wpList = _ILog_hh_godRep.FindListByClause(x => x.hhpc == hhpc);
懷疑是不是自動生成的SQL有問題,改成手寫的SQL,執行后發現還是不行
List<Log_hh_crd> kxList = _ILog_hh_crdRep.QueryList<Log_hh_crd>("SELECT * FROM [Log_hh_crd] WHERE hhpc=@hhpc ", new { hhpc = hhpc });
然后就是在網上找資料,最終有個回答引起了我的注意,於是我去確認了下Log_hh_crd表中的字段hhpc的類型,是varchar ,而上面自動生成的SQL里面是nvarcahr(4000),會不會是這個區別的問題呢
改了一對比,結果很明顯了,就是SQL中的類型與實際類型不一致,導致資源消耗遠遠超過預期。
試了SqlSugar提供的字段標注功能,有個ColumnDataType,加上試試
[SqlSugar.SugarColumn(ColumnDataType = "varchar(40)")] public string hhpc { get; set; }
結果不行,去翻了下文檔,說“自定義生成的數據類型,生成表會用到”,這條路走不通了。。。
只能使用終極辦法=======> 修改字段類型!!!
注意
1、如果這個字段存在索引的話,需要先備份索引創建SQL,然后刪除索引,再改字段格式,然后再加上索引
2、如果數據量比較大,建議在非業務高峰進行這個操作。