0

我正在使用數據Web服務將數據從數據庫傳輸到網站。我正在訪問4個表格(每個實體)在對服務的不同查詢中。SQL查詢損害我網站的速度--11秒加載

實施例:

  • 表1
  • 表2
  • 表3
  • 表4

僞代碼,我使用: FOREACH表1 - 獲取表2 - 獲取表3 - 獲取表4

在這種情況下,我得到1000個查詢。我勒個去?

如何在1個查詢中運行此操作?

我有我的頭幾個解決方案,但我不知道:

  • 首先解決 - 1查看,這基本上是 我的網絡數據服務創建自定義的「實體」。
  • 第二種解決方案是溝通Web服務,而 使用直接代理到數據庫。
  • 解決此問題的第三種解決方案是 Microsoft Cache?

但是我必須爲每個像這樣的「巨大」的操作做到這一點,這真的會激勵我。

創建1000個查詢並在11秒內加載頁面的方法示例。我知道這是完全不能接受的方式和書面差的方法,但你會建議:

public List<OfferLocalizedContent> GetOffersWithContent(long customerId) 
{ 
    var countryCode = 
     this._httpContext.Request.Cookies["countryCode"]; 

    var offers = 
     this.ClientRepositoryBuilder 
      .OfferClientRepository 
      .GetAllOffers(countryCode.Value, customerId); 

    List<OfferLocalizedContent> list = new List<OfferLocalizedContent>(); 

    foreach (var offer in offers) 
    { 
     var localizedContent = 
      new SyndicateBaseModel(this.ClientRepositoryBuilder) 
       .GetLocalizedContent(null, offer, null); 

     OfferLocalizedContent model = new OfferLocalizedContent(); 
     model.Offer = offer; 
     model.LocalizedContentModel = localizedContent; 

     var lotteries = 
      this.ClientRepositoryBuilder 
       .LotteryClientRepository 
       .GetLotteriesByOfferId(offer.Id); 

     var currencyRate = 
      this.ClientRepositoryBuilder 
       .CurrencyRateClientRepository 
       .GetCurrencyRateBasedOnCountryOrCustomer(countryCode.Value, customerId); 

     model.Jackpot = 
      new LandingPageBaseModel(this.ClientRepositoryBuilder) 
       .GetFeedJackpot(lotteries, currencyRate.Type, offer)/1000000; 

     list.Add(model); 
    } 

    return list; 
} 

GetFeedJackpot通過彩票循環再計算一些信息,這使得循環裏面循環。

public decimal GetFeedJackpot(List<Lottery> lotteries, byte customerAccountType, Offer offer = null) 
     { 
      decimal tempPrice = 0; 
      decimal realPrice = 0; 

      var currencyRates = 
       this.ClientRepositoryBuilder 
        .CurrencyRateClientRepository 
        .GetCurrencyRates(); 

      foreach (var item in lotteries) 
      { 
       var feedMapping = 
        this.ClientRepositoryBuilder 
         .FeedScraperLotteryMappingClientRepository 
         .GetFeedScraperLotteryMappingByLotteryId(item.Id); 

       if (feedMapping != null) 
       { 
        List<DrawDay> drawsList = 
         this.ClientRepositoryBuilder 
          .DrawDateClientRepository 
          .GetDrawDaysByLotteryId(item.Id); 

        var jackpot = 
         feedMapping 
          .FeedScraperJackpots 
          .OrderByDescending(fsj => fsj.CreatedOn) 
          .Take(11); 

        if (jackpot.FirstOrDefault().Amount == 0) 
        { 
         var jackpotAverages = jackpot.Skip(1); 

         if (jackpotAverages.Count() > 0) 
         { 
          foreach (var item_jackpot in jackpotAverages) 
          { 
           tempPrice += item_jackpot.Amount/jackpotAverages.Count(); 
          } 
         } 
        } 
        else 
        { 
         tempPrice = jackpot.FirstOrDefault().Amount; 
        } 

        if (lotteries.Count == 1 || offer.CurrencyType != 5) 
        { 
         realPrice += tempPrice; 
        } 
        else if(lotteries.Count > 1 && offer.CurrencyType == 5) 
        { 
         realPrice += 
          new WinningBaseModel(this.ClientRepositoryBuilder) 
           .ConvertLotteryAmountToAccountCurrency(currencyRates, tempPrice, lottery.CurrencyType, customerAccountType); 
        } 
       } 
      } 

      return 
       Math.Round(realPrice/1000000m) * 1000000; 
     } 

SQL事件探查器的操作基本上例子(1000查詢什麼?): enter image description here

我是主持人Azure的服務器上我的東西: DB - 數據網絡服務 - 網站

當我監控Web服務網站,它完全超載,因此加載網站時滯。

+1

聽起來就像是懶惰的加載,當你想要加載時。 http://www.c-sharpcorner.com/UploadFile/b1df45/lazy-loading-vs-eager-loading/ – UnhandledExcepSean 2015-02-24 00:09:12

+0

是懶加載是問題..我想我將不得不使用急切和禁用延遲加載。 – 2015-02-24 01:01:47

回答

0

我可以看到幾種方法來減少加載時間。

  1. 實施尋呼系統,以減少頁面上顯示的報價數量。 如果您的客戶有100萬個優惠,他們是否真的希望在單個頁面上看到所有100萬個優惠?

例如

public List<OfferLocalizedContent> GetOffersWithContent(
     long customerId, int page, int pagesize) 
{ 
    ... 
    var offers = this.ClientRepositoryBuilder 
        .OfferCLientRepository 
        .GetAllOffers(countryCode.Value, customerId) 
        .Skip(pagesize * page) 
        .Take(pagesize); // or you can do this in GetAllOffers 
} 
  • 使用任務來處理每個報價。

    foreach(var offer offers) { Task.Factory.StartNew(...); }