提高递归 SQL 请求的性能

发布于 2024-09-10 07:39:39 字数 236 浏览 6 评论 0原文

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

如果我在程序(ASP.NET项目)中使用递归方法调用DataTable中的类别及其子类别 性能很差。 许多用户会使用这个应用程序,所以一切都会变坏。 也许所有类别都填充到缓存对象,然后我们不必转到数据库。 但类别数为 15000 或 20000。 所以我认为这不是一个好方法。

我可以做什么来获得快速性能? 你给我什么建议吗?

I have so category and this categories have unlimited sub category.
In Database Table, Fields are ID, UpperID and Title.

If I call a category and its subcategory in DataTable with recursive method in program(ASP.NET project)
performance is very bad.
And many user will use this application so everything goes bad.
Maybe All categories Fill to A Cache object and then we musnt go to Database.
But category count is 15000 or 20000.
So I think isn't a good method.

What can I do for fast performance?
Are you give me any suggestion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

给不了的爱 2024-09-17 07:39:39

缓存或其他内存持久性比在关系系统上执行此操作要好得多:) ... 嘿... 哎呀!

只是我的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

查询结构所能做的最浪费的事情:
我在示例中使用的结构比 List 更快。 Dictionary 在键上使用索引 - 因此您可以使用 int 作为键(ID)

编辑:

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

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

caching or other in-memory-persistance is by far better than doing this on a relational system :) ... hey... it's oop!

just my 2 cents!

eg.

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 voila ... your tree is ready to go!

edit:
do you exactly know where your performance bottle-neck is?...

to give you some ideas, eg:

  • loading from database
  • building up the structure
  • querying the structure

loading from database:
then you should load it once and be sure to have some changetracking/notifying to get changes (if made) or optimize your query!

building up the structure:
the way i create the tree (traversal part) is the wastest you can do with a Dictionary<TKey, TValue>

querying the structure:
the structure i've used in my example is faster than List<T>. Dictionary<TKey, TValue> uses an index over the keys - so you may use int for the keys (IDs)

edit:

So you use DataTable to fix the
problem. Now you've got 2 problems: me
and DataTable

what do you have right now? where are you starting from? can you determine where your mudhole is? give us code!

回忆追雨的时光 2024-09-17 07:39:39

谢谢大家,

我找到了通用表表达式(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

Thanks All,

I find my solution with Common Table Expressions(CTE) fifty- fifty.
Its allow fast recursive queries.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文