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 つのステートメントに大きなギャップがあるのでしょうか? 誰かが私にいくつかのヒントを教えてもらえますか? どうもありがとう。
ジェイク