exec sp_executesql 比直接執行SQL慢,而且消耗大量資源問題


今天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、如果數據量比較大,建議在非業務高峰進行這個操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM