2011-06-13 4 views
0

두 개의 유효한 영국 우편 번호 사이에 Google/Bing으로부터 거리를 기록하는 테이블이 있습니다. 시스템이 사용됨에 따라이 테이블이 추가되어 다음 거리 쿼리가 빨라지고 웹 서비스를 호출하여 온라인으로 거리를 검색 할 필요가 없습니다.튜플에서 결과를 얻기위한 빠른 쿼리

ALTER FUNCTION [dbo].[GetDistanceFromCache] 
(@PostcodeA VARCHAR (MAX), @PostcodeB VARCHAR (MAX)) 
RETURNS DECIMAL 
AS 
BEGIN 
    DECLARE @FoundDistance AS DECIMAL; 
    SELECT @FoundDistance = DistanceMiles 
    FROM AddressInfoRecordedDistance 
    WHERE (PostcodeA = @PostcodeA 
        AND PostcodeB = @PostcodeB) 
       OR (PostcodeB = @PostcodeA 
         AND PostcodeA = @PostcodeB); 
    RETURN ISNULL(@FoundDistance, -1); 
END 

내가 알 필요가 다음과 같이

OID     PostcodeA PostcodeB DistanceMeters       DistanceMiles 
    -------------------- --------- --------- --------------------------------------- --------------------------------------- 
    1     BR60PS BT248DN 788847         490 
    2     BR60PS CM201JA 64426         40 
    3     BR60PS CM82AP 77640         48 
    4     BR60PS CO123AX 131617         82 
    5     BR60PS CT146EL 119366         74 
    6     BR60PS DA110TA 29247         18 
    7     BR60PS DE216AH 262570         163 
    8     BR60PS DL81AB 397524         247 
    9     BR60PS HG27JE 368802         229 
    10     BR60PS IP121AL 144394         90 
    11     BR60PS IP141AH 144183         90 
    12     BR60PS IP209AH 172259         107 

지금 내가 Linq에 - 투 - SQL을 사용 스칼라 UDF를 가지고가 정의 : 여기

는 테이블 구조 어떤 빠른 SQL 문 또는 C# linq 결과를 얻을 수 있다면? 800 명의 직원을 불러와 50 개의 작업에 대해 실행하면 시스템이 일시 중지되고 DBContext.GetDistanceFromCache()을 선택 세트에 추가하지 않으면 소요 시간이 상당히 줄어 듭니다.

 var query = 
        from locum in DbContext.Locums 
        where 
        locum.IsActive == true && 
        locum.IsAdminMarkedComplete == true && 
        locum.IsLocumsExciteBan == false && 
        locum.IsGPHCBan == false && 
         filterID1.Contains(locum.OID) == false && 
         filterID2.Contains(locum.OID) == false 
        select new { 
         LocumID = locum.OID, 
         LocumName = locum.FirstName + " " + locum.LastName, 
         locum.MobileNumber, 
         locum.Email, 
         Gender = locum.Gender ? "Male" : "Female", 
         locum.DateofBirth, 
         LocumType = locum.LocumType.Name, 
         **Distance** = DbContext.GetDistanceFromCache(_Postcode, locum.AddressInfo.Postcode), 
         Address = String.Format("{0} {1} {2} {3}", 
              locum.AddressInfo.House.Length == 0 ? String.Empty : locum.AddressInfo.House + ", ", 
              locum.AddressInfo.Street.Length == 0 ? String.Empty : locum.AddressInfo.Street + ", ", 
              locum.AddressInfo.Area.Length == 0 ? String.Empty : locum.AddressInfo.Area + ", ", 
              locum.AddressInfo.Postcode ?? String.Empty), 
         Postcode = locum.AddressInfo.Postcode, 
         City = locum.AddressInfo.City.Name, 
         County = locum.AddressInfo.City.County.Name, 
         locum.SystemUserID 
        }; 

답변

1

내가 DB는 결과 행이만큼 인 LINQ 쿼리 select new { ... }를 수행 할 때마다, 호출하기 때문에 쿼리가 느린 생각 : 여기

그리고

는 실속 쿼리입니다.

결과 집합과 일치시키기 전에 테이블 AddressInfoRecordedDistance에서 데이터를 다운로드합니다. 나는 다음과 같은 것을 생각하고있다 :

var query = from locum in DbContext.Locums 
      where ... 
      select new { ... }; // Don't include GetDistanceFromCache here 

var airds = from a in DbContext.AddressInfoRecordedDistance 
      select a; 

foreach (var q in query) 
    q.Distance = GetDistanceFromCache(q.PostcodeA, q.PostcodeB, airds); 

그리고 거기있다. 물론, 당신은 또한 GetDistanceFromCache 방법이 필요합니다 당신이 시대의 많은 위의 모두를 실행하는 경우, 물론

// The SQL UDF in C# code here (psuedo code, not tested, just "C blunt") 
decimal GetDistanceFromCache(string PostcodeA, string PostcodeB, List<...> table) 
{ 
    return (from t in table 
      where 
       (t.PostcodeA == PostcodeA && t.PostcodeB == PostcodeB) || 
       (t.PostcodeB == PostcodeA && t.PostcodeA == PostcodeB) 
      select t).FirstOrDefault().DistanceMiles; 
} 

을, 당신은 변수 airds를 캐시한다.

1

거리 쿼리에 더티 읽기가있는 경우 Nolock과 같은 테이블 힌트를 추가 할 수 있습니다. 자세한 내용은 MSDN's Table hints을 참조하십시오.

또 다른 옵션은 PostcodeAPostcodeBAddressInRecordedDatabse 테이블에 적절한 인덱스를 가지고 & 필드가 일치 변수의 데이터 유형은 그래서 암시 적 데이터 형식 변환이 없는지 확인하는 것입니다.

+0

색인 만들기는 가치있는 제안입니다. 내가 여기서 속도를 낼 수 있는지 보자. – DoomerDGR8

+0

나는 속력을 얻었다. 또한 PostcoseA와 PostcodeB 열 모두에 고유 한 제한 조건을 추가하여 데이터가 일관성이 있는지 확인했습니다. – DoomerDGR8

관련 문제