2009-08-11 3 views
1

시나리오를 설정하려면 테이블에 100000 개의 행이 있고 매일 점점 더 커지게됩니다. 이 대기열은 현재 테이블에서 약 40 또는 50 행만 검색하기 위해 2 초 이상 걸립니다.LINQ 쿼리를보다 빠르게 만들 수있게 도와주세요.

이 테이블의 데이터는 DateTime 참조로 그룹화되므로이 테이블의 다른 행과 유일한 동일 값이기 때문에 모든 데이터를 DateTime별로 그룹화하기 시작합니다. 각 행 그룹은 1 행에서 5 행 MAX까지 가능합니다. 그런 다음 그룹화 된 행을 선택하고 데이터를 선택하여 사용자에게 표시합니다. 내가 볼 수있는 문제는 SQL에서 EXIST와 Group을 발생 시킨다는 것입니다. 큐를 더 빨리 만들려면 40 개의 행을 모두 선택해야하지만 FOR 루프에서 각 그룹을 선택합니다. 그렇다면 어떻게하면이 대기열을 더 빨리 만들 수 있을까요? 그것들 모두가 가장 오래되었고 나의 사용자들은 2 초의 대기 시간에 대해 불평하고 있습니다. 도와주세요.

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

나는 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 일인 DateTime_Added 초로 좁혀 졌으므로 내부 쿼리가 실제로 아무 것도 수행하지 않는 것처럼 보입니다. 나는 틀릴 수도 있지만 내부 쿼리는 전혀 필요하지 않습니까?

만약 그렇다면 이해를 넓히거나 알려주십시오.

+1

나는 이것에 동의한다 - 항상 yy와 같은 레코드 인 xx가 존재하므로 Contains는 항상 참이다. – Jimmy

+0

좋은 점 Ryan ... 위대한 아이 주셔서 감사합니다! 그 중앙 부분을 꺼내서 똑같은 방식으로 작동합니다 ... 좋은 눈을 가져 주셔서 감사합니다! –

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() 

그것은에 변환 무엇. 먼저 SQL Server에서 테이블 인덱스를 살펴 보겠습니다. DateTime_Added에 대한 색인을 생성합니까?

현재 해당 컬럼에 인덱스가없는 경우 (SQL Server 관리 Studio에서)이 시도 :

CREATE INDEX IX_Data_Captured_Type_Military_DateTime_Added 
ON Data_Captured_Type_Military (DateTime_Added) 
GO 
관련 문제