3

我想使用Database Engine Tuning Advisor來優化我的數據庫,而我面臨的問題是我的SQL事件探查器跟蹤顯示使用sp_executesql執行的大量查詢 - 而且顧問程序無法處理這些。看起來這些查詢來自我正在使用的LINQ到實體,所以只是好奇,是否有任何方法可以直接讓LINQ-to-Entities調用語句。LINQ到實體擺脫sp_executesql

回答

4

同意Adam。在實體框架/ ADO.net中使用sp_executesql是故意的。然後執行類似於參數化存儲過程的查詢,並且SQL優化器可以重用查詢計劃。

如果你正在尋找調整你的數據庫,你也應該考慮這些查詢。我建議你,備份你的數據庫,使用重播跟蹤模板(在你的SQL分析器中)捕獲查詢,恢復你的數據庫,運行你的調優顧問設置其工作負載到這個跟蹤

+0

非常感謝,要去嘗試這種方式! – 2010-06-28 12:24:22

2

sp_executesql的使用是一種ADO.NET效果,不是特定於實體框架的某種東西。據我所知,沒有辦法指示它不要使用該存儲過程。

3

這只是一個人爲因素探查器中顯示RPC調用。有兩種主要類型的客戶端請求:語言(類型0x01)和RPC(類型0x03),如Free TDS protocol documentation所述。當調用是帶有參數的SQL批處理時,RPC調用將是類型0x03,長度爲0x0A,這是sp_executesql的快捷方式。

所以你看,真正的情況是,當一個客戶端,任何客戶端,提交包含參數的批次,它會出現,如果sp_executesql被調用。對於ODBC,OleDB,SqlClient,Sql Native Client也是如此,正如我所說的,任何客戶端。所以不是實體框架,也不是實際調用sp_executesql的ADO.Net(事實上,甚至沒有真正調用該過程,雖然這些請求執行起來就像被調用一樣,但是很複雜......)。這是協議的人工產物,只要您在請求中添加@parameter即可。

+0

感謝解釋 - 它明確的東西不少。現在我明白了這是怎麼回事! – 2010-06-28 12:25:09

5

LINQ/.NET通過將它們作爲sp_executesql調用發送到SQL服務器來運行SQL查詢。但是,數據庫引擎優化顧問無法解析這樣的,由SQL Server Profiler,捕獲的語句,所以調優會話的結果會很差。

這是我將數據庫引擎優化顧問供給數據庫引擎優化顧問之前,如何「解開」sp_executesql聲明,以便它可以正確分析它們。

  1. 您已經運行後在SQL Server事件探查(或打開現有的)優化會話,使用文件>導出>提取SQL Server事件>提取的Transact-SQL事件...保存。包含所有SQL語句的SQL文件。
  2. 打開.SQL文件(在例如記事本++ 6 - http://notepad-plus-plus.org/)並運行以下查找&代用正則表達式拆箱所有sp_executesql語句爲純TSQL。查找:^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$替換:BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
  3. 接下來,使用「裝箱的」 .SQL申請,我們已經在數據庫引擎優化顧問只是構建找出你neeed添加哪些索引。

快樂調整!請注意,我選擇記事本+ + 6(或以上),因爲它有一個相當不錯的正則表達式實現,其他texteditors可以在運行上面的表達式失敗。

+1

你爲什麼不頂部?這個簡單的發現和替換真的有竅門。除了EF爲每個過程調用使用相同的變量名稱。但是這真的很有幫助。謝了哥們! – Giri 2016-06-30 12:14:06