Быстродействие в рекурсивных SQL-запросах - PullRequest
0 голосов
/ 20 июля 2010

У меня есть такая категория, и у этой категории есть неограниченная подкатегория. В таблице базы данных полями являются ID, UpperID и Title.

Если я вызову категорию и ее подкатегорию в DataTable с рекурсивным методом в программе (проект ASP.NET) производительность очень плохая. И многие пользователи будут использовать это приложение, поэтому все идет плохо. Может быть, все категории Fill to A Cache объект, а затем мы должны перейти к базе данных. Но количество категорий составляет 15000 или 20000. Так что я думаю, что это не очень хороший метод.

Что я могу сделать для быстрого исполнения? Вы даете мне какие-либо предложения?

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Спасибо всем,

Я нахожу свое решение с помощью выражений общих таблиц (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
1 голос
/ 20 июля 2010

caching или другое постоянство в памяти намного лучше, чем делать это в реляционной системе :) ... эй ... это упс!

только мои 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 для ключей (идентификаторов)

редактирование:

Таким образом, вы используете DataTable для исправления проблема. Теперь у вас есть 2 проблемы: я и DataTable

что у тебя сейчас? откуда ты начинаешь? Вы можете определить, где находится ваша грязь? дай нам код!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...