1

通过 C# Linq to SQL 执行查询时,我遇到了一个非常奇怪的性能问题。通常查询需要一两秒来执行,但对于一些非常具体的搜索条件,查询突然需要一分钟以上才能通过 Linq to SQL 运行,但在 SQL Management Studio 中仍然只有 2 秒。

查询:

Linq to 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,则查询只需几秒钟即可运行(没有 TOP 条目,查询将返回 1841 个组中的 10121 行)。
  • 如果我将开始时间 (@p2) 设置为一年前,查询也会在几秒钟内完成。
  • 使用 SQL Server management Studio Activity Monitor,我可以看到错误查询确实运行了超过一分钟,并且我可以看到运行的 SQL 与我上面显示的相匹配。

帮助

我完全不知道如何进行此操作。

  • 为什么查询在 SQL Server Management Studio 上运行得很快,但在 Linq 上却非常慢?
  • 如果我从查询中提取更多记录(将 TOP 50 更改为 TOP 51),它为什么在 Linq 上运行速度快 30 倍(与 Management Studio 一样快)?

有任何想法吗?

4

1 回答 1

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
于 2013-05-27T14:11:46.320 回答