0

SQL Server データベースからデータをクエリするための非常に単純な LINQ to Entity Code が 1 つあります。そして、「MES_WO_Master」「MES_WO_Tracking」という2つのテーブルがあり、テーブル「MES_WO_Master」には列「WoNo」と「MaterialNo」にインデックスがあり、テーブル「MES_WO_Tracking」には列「EndDate」にインデックスがあります。エンティティへの LINQ は次のとおりです。

from w in MES_WO_Master
                        join r in MES_WO_Tracking
                        on w.WoNo equals r.WoNo
                        where r.EndDate >= DateTime.Parse("2013-01-02") && r.EndDate <= DateTime.Parse("2013-01-03") && r.QtyScrap > 0 && w.MaterialNo.EndsWith("-W")
                        select new
                        {
                            WoNo = w.WoNo,
                            MaterialNo = w.MaterialNo,
                            QtyComplete = r.QtyComplete.Value,
                            QtyScrap = r.QtyScrap.Value,
                            ScrapCode = r.ScrapCode,
                            EndDate = r.EndDate.Value
                        }

そして、この LINQ To Entity は、データを取得するために 30 秒以上実行する必要があります。LINQPad を使用して、この LINQ の実際の SQL ステートメントを取得しました。以下のような声明:

    -- Region Parameters
DECLARE @p0 VARCHAR(20)
SET @p0 = '2013-01-02'
DECLARE @p1 VARCHAR(20)
SET @p1 = '2013-01-03'
DECLARE @p2 BIGINT
SET @p2 = 0
DECLARE @p3 VARCHAR(3)
SET @p3 = '%-W'
-- EndRegion
SELECT  [t0].[WoNo] ,
        [t0].[MaterialNo] ,
        [t1].[QtyComplete] AS [QtyComplete] ,
        [t1].[QtyScrap] AS [QtyScrap] ,
        [t1].[ScrapCode] ,
        [t1].[EndDate] AS [EndDate]
FROM    [MES_WO_Master] AS [t0]
        INNER JOIN [MES_WO_Tracking] AS [t1] ON [t0].[WoNo] = [t1].[WoNo]
WHERE   ( [t1].[EndDate] >= @p0 )
        AND ( [t1].[EndDate] <= @p1 )
        AND ( [t1].[QtyScrap] > @p2 )
        AND ( [t0].[MaterialNo] LIKE @p3 )

しかし、@p3 を "%-W" に置き換えて、以下のように SQL Server 分析ウィンドウでステートメントを実行すると、1 秒もかかりません。

-- Region Parameters
DECLARE @p0 VARCHAR(20)
SET @p0 = '2013-01-02'
DECLARE @p1 VARCHAR(20)
SET @p1 = '2013-01-03'
DECLARE @p2 BIGINT
SET @p2 = 0
DECLARE @p3 VARCHAR(3)
SET @p3 = '%-W'
-- EndRegion
SELECT  [t0].[WoNo] ,
        [t0].[MaterialNo] ,
        [t1].[QtyComplete] AS [QtyComplete] ,
        [t1].[QtyScrap] AS [QtyScrap] ,
        [t1].[ScrapCode] ,
        [t1].[EndDate] AS [EndDate]
FROM    [MES_WO_Master] AS [t0]
        INNER JOIN [MES_WO_Tracking] AS [t1] ON [t0].[WoNo] = [t1].[WoNo]
WHERE   ( [t1].[EndDate] >= @p0 )
        AND ( [t1].[EndDate] <= @p1 )
        AND ( [t1].[QtyScrap] > @p2 )
        AND ( [t0].[MaterialNo] LIKE ***'%-W'***)

「%-W」がインデックスを使用しないことはわかっていますが、なぜこれら 2 つのステートメントに大きなギャップがあるのでしょうか? 誰かが私にいくつかのヒントを教えてもらえますか? どうもありがとう。

ジェイク

4

1 に答える 1

0

2 番目のクエリが 1 秒しかかからない理由は、最初に実行された後にキャッシュされるためです。直後に同じクエリを実行すると、時間がかかりません。このSOの質問を参照してください

そこの指示に従うと、実行時間の違いがエンティティが遅いためか、キャッシュを使用しているかどうかを確認できます。

また、SQL が生成しているクエリ プランを調べて、時間がかかる理由を確認することもできます

于 2013-03-01T00:25:12.030 に答える