2013-05-27 32 views
1

當通過C#Linq執行查詢到SQL時,我遇到了一個非常奇怪的性能問題。通常查詢需要一兩秒才能執行,但對於一些非常特定的搜索條件,查詢突然需要一分多鐘才能通過Linq to SQL運行,但在SQL Management Studio中仍然只有2秒。來自Linq的SQL查詢要比直接從管理工作室慢得多

查詢:

從所得的LINQ到SQL查詢的查詢是如下所示的相當複雜的結構。 TV_TRACKER_ORDER是合併來自10多個表格的數據的視圖。

DECLARE @p0 Int; SET @p0 = '4'; 
DECLARE @p1 Int; SET @p1 = '666685'; 
DECLARE @p2 DateTime; SET @p2 = '2/1/2013 12:00:00 AM'; 
DECLARE @p3 DateTime; SET @p3 = '5/23/2013 12:00:00 AM'; 

SELECT [t0].[HAULIER], [t0].[G_NUMBER], [t0].[CUST_ORDER_REF], [t0].[CUSTOMER], [t0].[RELEASE_NO], [t0].[BILL_OF_LADEN], [t0].[TERMINAL], [t0].[PRODUCT], [t0].[SCHEDULED_DELIVERY_DATE], [t0].[DRIVER], [t0].[TRACTOR], [t0].[TRAILER], [t0].[STATE], [t0].[DRIVER_NAME], [t0].[HOME_DEPOT], [t0].[TRACTOR_NAME], [t0].[TRAILER_NAME], [t0].[CUSTOMER_NAME], [t0].[TERMINAL_NAME], [t0].[STATE_NAME], [t0].[Shift], [t0].[SHIFT_NAME], [t0].[HOME_DEPOT_NAME], [t0].[DELIVERY_LOCATION], [t0].[DELIVERY_LOCATION_NAME], [t0].[SYSTEM_REMAINDER_RESOLUTION] 
FROM [dbo].[TV_TRACKER_ORDER] AS [t0] 
WHERE EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM (
     SELECT TOP (50) [t2].[G_NUMBER] 
     FROM (
      SELECT DISTINCT [t1].[G_NUMBER] 
      FROM [dbo].[TV_TRACKER_ORDER] AS [t1] 
      WHERE ([t1].[STATE] = (CONVERT(Decimal(29,4),@p0))) AND ([t1].[HAULIER] = (CONVERT(Decimal(29,4),@p1))) AND ((@p2) <= [t1].[SCHEDULED_DELIVERY_DATE]) AND ([t1].[SCHEDULED_DELIVERY_DATE] <= (@p3)) 
      ) AS [t2] 
     ORDER BY [t2].[G_NUMBER] 
     ) AS [t3] 
    WHERE [t3].[G_NUMBER] = [t0].[G_NUMBER] 
    ) 
ORDER BY [t0].[G_NUMBER] 

我曾嘗試:

  • 如果我改變TOP 50 TOP 49或者TOP 51的查詢只需要幾秒鐘就可以運行(沒有頂部進入,查詢返回1841組10121行)。
  • 如果我將開始時間(@ p2)設置爲一年前,查詢也會在幾秒鐘內完成。
  • 使用SQL Server管理Studio活動監視器我可以看到,錯誤的查詢DO實際上運行了一分多鐘,而且我可以看到正在運行的SQL與上面顯示的匹配。

幫助

我就如何使用這種繼續虧損完全是。

  • 查詢在SQL Server Management Studio上如何快速運行,但通過Linq極其緩慢?
  • 如果我從查詢中提取更多記錄(更改TOP 50到TOP 51),它在Linq上的運行速度是否快於Management Studio的30倍?

任何想法?

+1

顯然,性能問題是由與數據庫的查詢優化統計問題造成的。運行「exec sp_updatestats」修復了這個問題(http://msdn.microsoft.com/en-us/library/ms173804.aspx) – user1498506

+0

我只是建議統計數據作爲合理的第一次嘗試。將其添加爲答案並將其作爲正確答案接受。 –

回答

0

可能這對你有所幫助 -

DECLARE 
     @p0 INT 
    , @p1 INT 
    , @p2 DATETIME 
    , @p3 DATETIME 

SELECT 
     @p0 = 4 
    , @p1 = 666685 
    , @p2 = '20130201 12:00:00' 
    , @p3 = '20130523 12:00:00' 

SELECT * 
FROM dbo.TV_TRACKER_ORDER t0 
WHERE t0.[STATE] = @p0 
    AND t0.HAULIER = @p1 
    AND @p2 <= t0.SCHEDULED_DELIVERY_DATE 
    AND t0.SCHEDULED_DELIVERY_DATE <= @p3 
ORDER BY t0.G_NUMBER 
+0

真的,你不需要'EXISTS'。 – Devart

+0

謝謝,但我不想優化我的查詢(我堅持使用Linq to SQL爲我做的)。除了查詢在所有其他情況下都可以接受。 – user1498506

相關問題