[.NET] Dapper Oracle query slow with DateTime type parameter

  • 682
  • 0
  • 2016-09-12

Dapper Oracle query slow with DateTime type parameter

執行 Oracle 資料庫存取時,若使用 DateTime 當參數時速度總是特別慢,即使欄位有設定 Index 也是一樣

如以下語法,只是很簡單的刪除語法,原本可能1~2秒就執行完,卻要跑個 20~30 秒

_db.Execute("DELETE FROM Order WHERE OrderDate = :checkDate", new { checkDate });

改成使用 string.format 組 sql 會快很多,但可能會有 Sql Injection 的問題

_db.Execute($"DELETE FROM Order WHERE OrderDate = '{checkDate.ToString("yyyy/MM/dd")}'");

以前專案忙都直接妥協用第二種方式處理,最近在 tune  sql 的效能,就想了解一下到底是為何會這樣..

在 Google 後找到了問題點,原因是執行 sql 時, DateTime 參數會被 Oracle 自動轉換為 Timestamp,

而轉換後就吃不到任何的 Index,才會造成效能低落的問題,

知道問題後,就可以改成以下語法來解決,只要將 Timestamp 再轉換為 date,就可以回復到原本的速度

_db.Execute("DELETE FROM Order WHERE OrderDate = cast(:checkDate as date)", new { checkDate });