簡體   English   中英

通過Entity Framework提高SQL Server中的搜索性能

[英]Improve search performance in SQL Server through Entity Framework

我正在使用SQL Server 2012 Express,Entity Framework 6和ASP.NET MVC 5。

在SQL Server中,我有一個包含40萬條記錄的pricelist表。 價格表的結構如下:

|Id|Manufacturer|Name|Description|StockQuantity|PriceId|

我也有price表:

|Id|Price|CurrencyId|

currency表:

|Id|Name|Alias|Value|

Name和“ Description列由SQL Server全文索引編制索引。

我需要從pricelist獲取20條記錄,其中NameDescription 包含搜索查詢並將其作為XML返回。 而且我需要讓它們少於一秒,因為它是全局搜索服務的條件之一(它的請求超時是1秒而我無法改變它)。 這是XML結果的結構:

<items>
    <item mfr="PC" Name="Laptop" Description="2.4GHz, etc." StockQuantity="500" P1="100" P2="200" P3="300" Cur="USD"/>
</items>

其中P1P2P3是不同訂單數量的價格。

我正在使用此代碼來獲取記錄:

using (var db = new DatabaseContainer()) {
    db.Configuration.AutoDetectChangesEnabled = false;
    db.Configuration.ValidateOnSaveEnabled = false;
    db.Configuration.LazyLoadingEnabled = false;

    var result = 
        (from pricelistRow in db.EFPricelist
        where pricelistRow.Name.Contains(search) || pricelistRow.Description.Contains(search)
            select new Result {
            Manufacturer = pricelistRow.Manufacturer,
            Name = pricelistRow.Name,
            Description = pricelistRow.Description,
            StockQuantity = pricelistRow.StockQuantity,
            P1 = pricelistRow.EFPricelistRowPrice.Any() ? SqlFunctions.StringConvert(pricelistRow.EFPricelistRowPrice.Min(x => x.Price)) : "",
            P2 = pricelistRow.EFPricelistRowPrice.Count() == 3 ? SqlFunctions.StringConvert(pricelistRow.EFPricelistRowPrice.OrderBy(x => x.Price).Skip(1).FirstOrDefault().Price) : "",
                P3 = pricelistRow.EFPricelistRowPrice.Count() > 1 ? SqlFunctions.StringConvert(pricelistRow.EFPricelistRowPrice.Max(x => x.Price)) : "",
                Cur = pricelistRow.EFPricelistRowPrice.Any() ? pricelistRow.EFPricelistRowPrice.FirstOrDefault().EFCurrency.Alias : ""
                    }).Take(20).ToList();
    return new XmlResult(new Result {
        Items = result
    });
}

它花了大約2秒鍾。 如何提高性能?

不要使用包含。 這完全不是實體框架問題 - 而是SQL。

pricelistRow.Name.Contains(搜索)

轉換為WHERE [Name] LIKE'%searchterm%'

看前面的%? 這意味着完整的數據掃描和索引沒有幫助。

備擇方案:

  • StartsWith(LIKE'searchterm%'),因此索引有效

  • 使用存儲過程(在EF中沒有其他方式)然后使用全文索引語法(EF無法處理)。

但否則 - 這是行不通的。 這種情況意味着 - 在您的情況下 - 全表掃描。 期。

暫無
暫無

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

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