通过 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 一样快)?
有任何想法吗?