簡體   English   中英

金字塔循環的性能調優

[英]Performance tuning for pyramid looping

我正在為我的客戶設計一個金字塔計划,他將把這個結構應用到系統中。 這是一個推薦方案,如果介紹人加入網站,所有上層都將享受推薦費。

在此處輸入圖片說明

這是我的表結構,所以根據列的推薦,我可以找到特定用戶的所有上線或下線。

但是,當我使用此語句進行循環時,(抱歉無法提供完整代碼,因為它很大,但使用以下代碼很容易理解)

for (int a = 0; a < lowerLine.Count; a++)
{
    var query3 = from data in db.users_table where data.referral_by == referralUser && data.is_activated == true select new{ data.user_id,data.introducer};
    var lowerLine2 = query3.ToList();
    lowerLineCount2 += lowerLine2.Count;
    totalCount += lowerLine2.Count;
}

這是一個 linq 語句,它會一直循環到金字塔末端以獲得總推薦。 但是如果執行這個東西,如果他有500個referral,獲取所有數據會變得很慢。

在這種情況下,我認為有一個通過存儲過程獲取所有數據的解決方案,但是當我嘗試執行該語句 500 次時,性能仍然是 26 秒,這仍然很慢,我的要求是最多 10 秒來獲取所有數據出去。 因此,存儲過程不是一種選擇,因為它在一次執行時仍然會很慢在此處輸入圖片說明

我可以知道如何在 10 秒內通過這個傳銷計划獲取所有數據嗎? 我不介意索引,但是我對推薦的索引進行了索引,結果仍然很慢

首先,使用char(n)是一個壞習慣,很容易給你帶來問題,我總是對用戶輸入的數據使用NVARCHAR(n)

其次,您可能想查看存儲過程中的Recursive Common Table Expression (CTE) 根據表大小和其他因素,它可能會給您提供比通過 EF 查詢更好的性能。 然而,標准的 T-SQL 循環也值得測試,更多資源見下文。

最后,我不確定這是否是 EF 代碼優先的方法,而您的referral_by是導航屬性,但我會確保它以任何一種方式被適當地編入索引

...

下面的代碼只是嘗試列出@SomeUser的推薦樹(即根據您的原始問題新添加的成員)。 我不完全確定你想用最低線的東西做什么

CTE

With UserCte as
(
  //Anchor Query
  Select user_id, first_name, last_name, referral_by from users Where user_id=@SomeUser
  Union all
  //Recursive Query
  Select U.user_id, U.first_name, U.last_name, U.referral_by from users U
  Inner Join UserCte M //Joining with anchor member
  On U.user_id = M.user_id
)

//Returning all user of user_id @SomeUser
Select * from UserCte 

注意事項

  • 這只是一個示例,尚未經過測試,但它應該為您指明更好的方向
  • 績效沒有硬性規定,對某人有益的不一定對你有益; 最好在你自己的系統上用這些類型的東西做你自己的基准測試

資源

使用公用表表達式

優化遞歸 CTE 查詢

您可以很好地使用索引。對於您的情況,您可以使用主索引或集群索引。 為此,您首先需要確定哪些是經常使用的列和查詢。 為此,您將需要一次又一次地修改您的 ER 模型。我希望性能會有所提高

通過查看您的 SQL 表,我假設您可能沒有正確地完成 ER 模型。在您的表中有這么多空列是一種糟糕的方法。 所以,從根開始,然后你會自動看到不同之處。

對於您的參考: 索引

暫無
暫無

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

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