簡體   English   中英

我如何加快這些linq查詢?

[英]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.

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