C# Linq to SQL を介してクエリを実行すると、非常に奇妙なパフォーマンスの問題が発生します。通常、クエリの実行には 1 ~ 2 秒かかりますが、特定の検索条件では、Linq to SQL を介してクエリを実行するのに突然 1 分以上かかりますが、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) を 1 年前に設定すると、クエリも数秒で完了します。
- SQL Server Management Studio のアクティビティ モニターを使用すると、問題のあるクエリが実際に 1 分以上実行されていることがわかります。また、実行された SQL が上に示したものと一致することがわかります。
ヘルプ
私はこれをどのように進めるかについて完全に途方に暮れています。
- SQL Server Management Studio ではクエリが高速に実行されるのに、Linq では非常に遅いのはなぜですか?
- クエリからさらにいくつかのレコードを抽出すると (TOP 50 を TOP 51 に変更)、Linq で 30 倍速く (Management Studio と同じくらい速く) 実行されるのはなぜですか?
何か案は?