sql儲存過程比sql語句執行慢很多

2022-08-31 00:51:13 字數 684 閱讀 4097

引數嗅探的問題

原因:(1)可能是發生了引數嗅探,第一次賦給儲存過程的輸入引數,會為該儲存過程生成乙個基於輸入引數的執行計畫,因此如果第一次輸入的引數不具有代表性(例如大部分查詢輸入的引數都是a值,但第一次執行儲存過程時輸入的是b值),就有可能比即席查詢慢,儘管即席查詢需要重新編譯執行計畫,但選擇了更有效率的計畫。

嘗試使用和即席查詢一樣的引數,來執行儲存過程,然後對比一下兩者的執行計畫。

(2)通常儲存過程最上面有自帶的set設定,如set ansi_nulls on,而即席查詢通常沒有包含,這些set設定也會影響執行計畫。

嘗試在即席查詢中新增上,與儲存過程一樣的set設定,然後再對比一下執行計畫。

解決方案:

1)通過使用declare宣告的變數來代替引數:使用set @variable=@thedate的方式,將出現@thedate的sql語句全部用@variable來代替。

(2)  將受影響的sql語句隱藏起來,比如:

a)      將受影響的sql語句放到某個子儲存過程中,比如我們在@thedate設定成為今天後再呼叫乙個字儲存過程將@thedate作為引數傳入就可以了。

b)      使用sp_executesql來執行受影響的sql。執行計畫不會被執行,除非sp_executesql語句執行完。

c)      使用動態sql(」exec(@sql)」來執行受影響的sql。

EF Core 執行SQL語句和儲存過程

無論orm有多麼強大,總會出現一些特殊的情況,它無法滿足我們的要求。在這篇文章中,我們介紹幾種執行sql的方法。在具體內容開始之前,我們先簡單說明一下要使用的表結構。public class category public string categoryname 在category定義了兩個字段 c...

SQL分頁儲存過程比拚

1 sql server 儲存過程的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發表一下我的觀點 2 建立表 4 create table testtable 5 id int identity 1,1 not null 6 firstname nvarchar 100 collate ...

用儲存過程實現for迴圈執行sql語句

預設情況下,delimiter是分號 在mysql中每行命令都是用 結尾,回車後自動執行,在儲存過程中 往往不代表指令結束,馬上執行,而delimiter原本就是 的意思,因此用這個命令轉換一下 為 這樣只有收到 才認為指令結束可以執行 delimiter 建立新的函式 create procedu...