2015-05-07 48 views
8

存儲過程和實體框架存在問題。運行存儲過程時出現實體框架問題

讓我解釋發生了什麼......以及迄今爲止我所嘗試過的。

我有一個存儲過程,它不會做一個可怕的很多

SELECT 
    COUNT(DISTINCT(EmailAddress)) AcceptedQuotes, 
    CONVERT (DATE,QuoteDate) QuoteDate 
FROM 
    Quote Q 
JOIN 
    Person P on Q.PersonPk = P.Pk 
JOIN 
    Product Pr on Q.ProductPk = Pr.Pk 
JOIN 
    Accepted A on Q.Pk = A.QuotePk 
WHERE    
    QuoteDate between @startDate and @endDate 
    AND CompanyPk = @companyPk 
    AND FirstName != 'Test' 
    AND FirstName != 'test' 
    AND FirstName != 'EOH' 

我要執行此,它工作在SSMS罰款,甚至用不了1秒。

現在,我導入此在實體框架,它的時間了,我設置的命令超時120 ...

好了,所以我迄今嘗試過什麼,我已經測試。

如果我使用SqlCommand,SqlDataAdapter,DataTable方式,用我自己的連接字符串,它按預期執行。當我在這種情況下使用實體框架連接字符串時,它超時。

我改變了我的存儲過程以包含「重新編譯」選項,並且嘗試了SET ARITHABORT的方式,沒有運氣,它在超過EF時超時。

這是EF中的一個錯誤嗎?

我現在剛剛決定重寫這個使用「舊學校」數據訪問。

另請注意,EF可以在同一數據庫中與其他存儲過程一起使用。

任何想法或幫助將不勝感激...

PS。我發現這篇文章,但是沒有幫助或者:(

http://www.sommarskog.se/query-plan-mysteries.html

+0

你可以嘗試更簡單的查詢沒有任何地方cluase,如選擇TOP 1,並看看你是否得到結果 –

+0

你可以發佈你用來執行此查詢的代碼?另外,嘗試使用sql server profiler來查看底下發生了什麼。也許你在EF案例中傳遞了錯誤的參數值? –

+0

好吧,我運行了分析器,EF正在查殺數據庫服務器。 ** CPU 3**,**讀取1364453 **這是什麼地獄,並且這被改爲不使用帶有參數的where子句,並且只能選擇前10個 – Kobie

回答

1

這可能是由Parameter Sniffing

當存儲過程被編譯或重新編譯引起的,通過了該調用的參數值是「嗅」並用於基數估計。淨效果是,由於如果這些特定的參數值用作在查詢文字計劃最優化。

  1. 我們荷蘭國際集團沒有直接顯示在參數也保證執行計劃的穩定性,而不需要虛擬變量來添加編譯 提示,下面的例子:

創建過程DBO。SearchProducts @Keyword VARCHAR(100)作爲聲明@Keyworddummy爲varchar(100)設置@Keyworddummy = @Keyword SELECT * FROM產品,其中關鍵字等 @Keyworddummy

  • 爲了防止這種情況並其他類似的情況下,你可以使用下面的查詢選項:
  • OPTIMIZE FOR RECOMPILE

    批量 期間
  • 禁用自動更新的統計數據
  • +3

    我認爲這可能是參數嗅探或過時統計。 – ewahner