[英]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條記錄,其中Name
或Description
包含搜索查詢並將其作為XML返回。 而且我需要讓它們少於一秒,因為它是全局搜索服務的條件之一(它的請求超時是1秒而我無法改變它)。 這是XML結果的結構:
<items>
<item mfr="PC" Name="Laptop" Description="2.4GHz, etc." StockQuantity="500" P1="100" P2="200" P3="300" Cur="USD"/>
</items>
其中P1
, P2
和P3
是不同訂單數量的價格。
我正在使用此代碼來獲取記錄:
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.