2009-08-11 9 views
1

シナリオを設定するには、テーブルに100000行があり、それがますます大きくなると言います。このキューは現在、テーブルから約40または50行だけを取得するのに2秒以上かかる。このLINQクエリをより速くしてください。

この表のデータは、DateTime参照でグループ分けされているため、これは表内の他の行と唯一等しい値であるため、すべてのデータをDateTimeでグループ化することから始めます。行の各グループは、1行から5行MAXまでの任意の場所にすることができます。次に、グループ化された行を選択し、データを選択してユーザーに表示します。私が見ることができる問題は、SQLでEXISTとGroupを引き起こすことです。キューを高速化するためには、一度に40行すべてを選択する必要がありますが、FORループで各グループを選択します。どうすればこのキューを高速化できますか?そのうちの最も遅いものと私のユーザーは2秒の待ち時間について不平を言っています。助けてください。

それはに変換何
(from yy in Data_Captured_Type_Militaries 
    where yy.DateTime_Added >= DateTime.UtcNow.AddHours(-72) 
    (from xx in Data_Captured_Type_Militaries 
    where xx.DateTime_Added >= DateTime.UtcNow.AddHours(-72) 
    group xx by xx.DateTime_Added into gg 
    select gg.Key).Contains(yy.DateTime_Added) 
    select new 
    { 
     yy.Elites, 
     yy.DateTime_Added, 
     yy.Uid, 
     yy.Military_Location, 
     yy.Province_ID, 
     yy.Time_To_Return 
    }).ToList() 

SELECT [t0].[Elites], [t0].[DateTime_Added], [t0].[uid] AS [Uid],[t0].[Military_Location], [t0].[Province_ID], [t0].[Time_To_Return] 
FROM [Data_Captured_Type_Military] AS [t0] 
WHERE (EXISTS (
    SELECT NULL AS [EMPTY] 
    FROM (
     SELECT [t1].[DateTime_Added] 
     FROM [Data_Captured_Type_Military] AS [t1] 
     WHERE [t1].[DateTime_Added] >= @p0 
     GROUP BY [t1].[DateTime_Added] 
     ) AS [t2] 
    WHERE [t2].[DateTime_Added] = [t0].[DateTime_Added] 
    )) AND ([t0].[DateTime_Added] >= @p1) 
+1

は、私は多くの年前にこのゲームをプレイ.... :) – Jimmy

+0

おかげジミーを覚えているが、それは確かに役立ちません。 lol –

答えて

2

あなたはソートのこれを説明するが、私はまだ何、この部分を理解していません

where (from xx in Data_Captured_Type_Militaries 
     where xx.DateTime_Added >= DateTime.UtcNow.AddHours(-72) 
     group xx by xx.DateTime_Added into gg 
     select gg.Key).Contains(yy.DateTime_Added) 

このネストされたクエリは、最後の3日以内にそれぞれユニークなDateTime_Addedを取得します。これを使用して、それぞれのクエリが内側のクエリに存在することを確認して、外側のクエリを絞り込みます。

外部クエリ

はすでに DateTime_Added秒の直近3日間に絞られているので、実際にそれには何もしないだろう、内側のクエリのように見えます。私は間違っている可能性がありますが、内部クエリはまったく必要ですか?

私が理解していないことを広げたり、私に知らせてください。

+1

私はこれに同意します。常にyyと同じレコードであるxxが存在するので、Containsは常に真です。 – Jimmy

+0

グッドポイントライアン...偉大な目をありがとう!私はその中央部分を取り出し、それは同じ正確な方法で動作します...良い目に感謝! –

2

クエリは非常に単純に見えます。 SQL Serverでテーブルインデックスを調べることから始めます。 DateTime_Addedのインデックスを作成していますか?

あなたが現在その列に索引を持っていない場合は、(SQL Server Management Studioで)これを試してみてください。

CREATE INDEX IX_Data_Captured_Type_Military_DateTime_Added 
ON Data_Captured_Type_Military (DateTime_Added) 
GO 
関連する問題