簡體   English   中英

從元組中獲取結果的快速查詢

[英]Fast query to obtain a result from a tuple

我有一張表格,記錄了兩個有效的英國郵政編碼之間與 Google/Bing 的距離。 隨着系統的使用,這個表被添加,以便下一個距離查詢變得更快,我不必調用 web 服務來在線檢索距離。

這是表結構:

    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-to-SQL 使用的標量 UDF,它的定義如下:

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

我需要知道是否有更快的 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
                    };

我認為您的查詢很慢,因為每次 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

如果您對距離查詢的臟讀感到滿意,您可以添加像 Nolock 這樣的表提示。 有關詳細信息,請參閱MSDN 的表格提示

另一種選擇是確保您在PostcodeAPostcodeBAddressInRecordedDatabse表上有正確的索引,並且變量和字段的數據類型匹配,因此沒有隱式數據類型轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM