[英]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
注意事項:
資源
您可以很好地使用索引。對於您的情況,您可以使用主索引或集群索引。 為此,您首先需要確定哪些是經常使用的列和查詢。 為此,您將需要一次又一次地修改您的 ER 模型。我希望性能會有所提高
通過查看您的 SQL 表,我假設您可能沒有正確地完成 ER 模型。在您的表中有這么多空列是一種糟糕的方法。 所以,從根開始,然后你會自動看到不同之處。
對於您的參考: 索引
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.