[英]How can i speed up these linq queries?
我可以將以下兩個linq查詢合並為一個,以加快處理速度嗎?
第一個,搜索並執行分頁
Products.Data = db.Products.Where(x => x.ProductCode.Contains(search) ||
x.Name.Contains(search) ||
x.Description.Contains(search) ||
x.DescriptionExtra.Contains(search) ||
SqlFunctions.StringConvert(x.Price).Contains(search) ||
SqlFunctions.StringConvert(x.PriceOffer).Contains(search) ||
SqlFunctions.StringConvert(x.FinalPrice).Contains(search) ||
SqlFunctions.StringConvert(x.FinalPriceOffer).Contains(search))
.OrderBy(p => p.ProductID)
.Skip(PageSize * (page - 1))
.Take(PageSize).ToList();
而第二個則計算過濾后的總結果。
int count = db.Products.Where(x => x.ProductCode.Contains(search) ||
x.Name.Contains(search) ||
x.Description.Contains(search) ||
x.DescriptionExtra.Contains(search) ||
SqlFunctions.StringConvert(x.Price).Contains(search) ||
SqlFunctions.StringConvert(x.PriceOffer).Contains(search) ||
SqlFunctions.StringConvert(x.FinalPrice).Contains(search) ||
SqlFunctions.StringConvert(x.FinalPriceOffer).Contains(search))
.Count();
擺脫您可笑的低效轉換。
SqlFunctions.StringConvert(x.Price)。包含(搜索)||
不可能使用索引,進行全表掃描以及進行一次轉換-那樣糟。
並確保您擁有所有索引。
您無能為力。
停止使用“包含”功能,因為這是一件非常緩慢的事情(如果可以的話)
確保您的查詢可以使用數據庫中的索引。 如果您必須“包含”-查看SQL的全文本搜索功能,但是您可能需要更改此純sql或自定義Linq如何轉換為SQL以利用全文本索引
我認為您不能直接將它們結合起來。 這是分頁的問題-無論如何,您都需要知道結果的總數。 動態分頁的問題還在於,一個頁面可能與另一頁面不一致,因為它來自不同的時間。 因此,您可以輕松地完全錯過項目。 如果這可能是一個問題,我將避免動態分頁。 您可以將整個結果的ID填充到服務器上的某個臨時表中,然后從那里進行分頁。 或者,您可以從全文本搜索中返回所有ID,並按需查詢其余數據。
還有更多優化,您可以在搜索字符串至少3個字符長時開始返回結果,或者為此目的可以構建帶有計數估計的特殊表。 您還可以決定僅返回前十頁,並為ID保存服務器存儲(對於ID則保存客戶端帶寬)。
我很遺憾地看到答案,而不替代“使用含有停止”。 必須在單詞中間進行多次搜索。 事實是,SQL Server的文本處理速度非常慢,搜索也不例外。 AFAIK甚至全文本索引在中間子字符串搜索中也無濟於事。
對於提出的關於1萬條記錄的查詢,我希望每個查詢大約需要40毫秒才能獲得計數或所有結果(我的桌面)。 您可以對所有文本進行級聯並轉換所有數字,然后對該表進行計算得出的持久化列,並且僅查詢該列。 它將大大加快速度(在我的桌面上查詢不到10毫秒)。
[computedCol] AS (((((((((([text1]+' ')+[text2])+' ')+[text3])+' ')+CONVERT([nvarchar](max),[d1]))+' ')+CONVERT([nvarchar](max),[d2]))+' ')+CONVERT([nvarchar](max),[d3])) PERSISTED
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.