递归SQL请求中的速度性能

时间:2010-07-20 13:40:15

标签: sql caching recursion

我有这样的类别,这个类别有无限的子类别。 在数据库表中,字段是ID,UpperID和标题。

如果我在程序中使用递归方法调用DataTable中的类别及其子类别(ASP.NET项目) 表现非常糟糕。 许多用户将使用此应用程序,所以一切都很糟糕。 也许所有类别填充到Cache对象然后我们去了数据库。 但类别计数是15000或20000。 所以我觉得这不是一个好方法。

我可以为快速表现做些什么? 你有什么建议吗?

2 个答案:

答案 0 :(得分: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);
    }
}
瞧......你的树准备好了!

修改
确切地知道你的表现瓶颈在哪里?...

给你一些想法,例如:

  • 从数据库加载
  • 建立结构
  • 查询结构

从数据库加载:
然后你应该加载一次并确保有一些改变跟踪/通知以获得更改(如果做出)或优化你的查询!

建立结构:
我创建树的方式(遍历部分)是你用Dictionary<TKey, TValue>

做的最浪费的事情

查询结构:
我在我的例子中使用的结构比List<T>快。 Dictionary<TKey, TValue>使用键上的索引 - 因此您可以使用int作为键(ID)

修改

  

所以你使用DataTable来修复   问题。现在你有两个问题:我   和DataTable

你现在有什么?你从哪里开始?你能确定你的泥坑在哪里吗?给我们代码!

答案 1 :(得分:1)

全部谢谢,

我找到了使用公用表格表达式(CTE)的解决方案五十五。 它允许快速递归查询。

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