2010-07-20 54 views
0

我有這樣的類別,這個類別有無限的子類別。 在數據庫表中,字段是ID,UpperID和Title。遞歸SQL請求中的速度性能

如果我在程序(ASP.NET項目) 中使用遞歸方法在DataTable中調用類別及其子類,性能非常糟糕。 許多用戶會使用這個應用程序,所以一切都變糟糕。 也許所有的類別填入一個緩存對象,然後我們發送到數據庫。 但類別數量是15000或20000. 所以我認爲不是一個好方法。

快速性能我能做些什麼? 你給我任何建議嗎?

+1

給我們你的sql-stmt :) – 2010-07-20 13:43:43

+1

確實分享你的查詢,有可能創建一個遞歸查詢。還請告訴我們您使用的是哪種DMBS? – 2010-07-20 14:24:48

+0

你需要做數學 - 有多少用戶?內存中的類別對象有多大?你有多少內存?這個瓶頸有多大?您是否在使用每用戶線程模型?如果是這樣,是否有辦法構建一個單實例持久緩存,或許是在同一臺機器上構建一個協同服務並通過快速進程間通信層連接到它? – 2010-07-20 14:55:09

回答

1

感謝所有,

我發現我與通用表表達式(CTE)五十50解決方案。 它允許快速遞歸查詢。

WITH CatCTE(OID, Name, ParentID) 
AS 
( 
    SELECT OID, Name, ParentID FROM Work.dbo.eaCategory 
    WHERE OID = 0 
     UNION ALL 
    SELECT C.OID, C.Name, C.ParentID FROM Work.dbo.eaCategory C JOIN CatCTE as CTE ON C.ParentID= CTE.OID 
) 
SELECT * FROM CatCTE 
1

caching或其他內存中的持久性遠遠好於在關係系統上執行此操作:) ...嘿...它是oop!

只是我的2美分!

例如。

var categories = /* method for domain-objects*/.ToDictionary(category => category.ID); 
foreach (var category in categories.Values) 
{ 
    if (!category.ParentCategoryID.HasValue) 
    { 
     continue; 
    } 
    Category parentCategory; 
    if (categories.TryGetValue(category.ParentCategoryID.Value, out parentCategory)) 
    { 
     parentCategory.AddSubCategory(category); 
    } 
} 

et瞧......你的樹已經準備好了!

編輯:
確切地知道你性能瓶頸是...

給你一些想法,例如:

  • 從數據庫
  • 搭建結構
  • 查詢結構

從數據庫loading:
那麼你應該加載一次,並確保有一些更改跟蹤/通知獲取更改(如果有的話)或優化您的查詢!

建立結構:
我創建樹(遍歷部分)的方式是你可以用一個Dictionary<TKey, TValue>

查詢結構做形影:
我在我的例子中使用的結構快於List<T>Dictionary<TKey, TValue>使用的鑰匙索引 - 所以你可以使用int的鑰匙(IDS)

編輯:

所以你使用數據表來解決 問題。現在你有兩個問題:我 和DataTable

你現在有什麼?你從哪裏開始?你能確定你的泥潭在哪裏嗎?給我們代碼!

+0

謝謝,但我的代碼像您的代碼一樣。 我有20000類別記錄和許多用戶。 所以我的問題是速度。 我尋找最佳性能。 – Murat 2010-07-20 13:53:15