2011-01-11 48 views
2

我看到與使用LINQ to SQL執行查詢相關的超時問題。所以我做了一個簡單的控制檯程序,問題仍然存在,並非總是如此,但隨機數足以讓我擔心。這幾乎是我的整個程序:使用LINQ to SQL查詢大表(10M +行)導致超時

public static TransactionDataContext DataContext = new TransactionDataContext(); 

    static void Main(string[] args) 
    { 
     int year = ...; 
     int stateCode = ...; 

     DateTime minYear = new DateTime(year, 01, 01); 
     DateTime maxYear = new DateTime(year, 12, 31); 

     var volumes = DataContext.TRANSACTIONs.Where(p => 
       p.STATE_NO == stateCode && 
       p.TRANS_DATE >= minYear && 
       p.TRANS_DATE <= maxYear).OrderBy(p => p.TRANS_DATE); 

    } 

我的數據庫中的TRANSACTION表有10M +記錄。在最後一個關閉花括號處設置斷點後,我運行調試器。有時,擴展卷變量和結果視圖會顯示數據,有時會顯示「功能評估超時」。通過設置DataContext.CommandTimeout延長超時似乎沒有幫助,我不認爲這是解決方案。

我的問題是爲什麼LINQ to SQL有這種限制,或者如果我做錯了。

更新:從Management Studio運行SQL語句是好的,所以我不認爲這是一個索引問題。

+3

嘗試在調試時運行SQL查詢分析器,然後可以找到正在執行的SQL查詢,並通過查詢分析器運行它以查看保留的內容。 – PostMan 2011-01-11 21:34:40

+1

查詢在調試器外部運行時,您是否遇到超時問題?調試器有自己的超時讀取變量的值。 – 2011-01-11 21:35:52

回答

2

這可能是一個比LINQ更多的SQLServer問題。 您需要覆蓋索引TRANS_DATESTATE_NO。如果你沒有,那麼這將解釋這個問題,這不是一個LINQ問題。

2

我不認爲問題是因爲你有10M記錄,因爲查詢還沒有執行(因爲你沒有調用ToListToArray)。

需要花費時間的是生成SQL腳本。

我想先刪除一些查詢參數,例如,刪除OrderBy,使凡只有p.STATE_NO == stateCode,檢查然後會發生什麼。

然後,一步一步地添加一些參數,你會看到是什麼原因造成的問題。 它甚至可能不支持這種日期比較,或者STATE_NO與stateCode是不同的類型,我不確定,我只是在大聲思考。

這會幫助你解決問題。

你也想測試使用Entity-SQLprogrammatically(甚至硬編碼查詢)塑造你的查詢(無linq),這將幫助你解決問題。

另一個想法是想使用ToTraceString來查看EF爲linq生成的內容。但是,如果上述內容對你沒有任何幫助,你將不得不向我們提供你的例外細節/堆棧跟蹤,以便讓我們知道這是什麼。