Сервер MS SQL и деревья

Я ищу способ извлечения данных из таблицы дерева, как определено ниже.

Дерево таблицы определяется как:-
TreeID uniqueidentifier
TreeParent uniqueidentifier
TreeCode varchar(50)
TreeDesc varchar(100)

Некоторые данные (23 тыс. строк), родительские ссылки обратно в идентификатор в таблице

Следующий SQL отображает все дерево (занимает около 2 минут 30)

Мне нужно сделать следующее.

1) Визуализация каждого узла дерева с его родительским элементом уровня 1
2) Визуализация всех узлов, описание которых соответствует TreeDesc, например SomeText%
3) Визуализация всех родительских узлов, относящихся к одному идентификатору дерева.

Пункты 2 и 3 занимают 2 минуты 30 минут, так что это должно быть намного быстрее!
Пункт 1, просто не могу решить, как это сделать, не убивая SQL или не тратя время

любые предложения будут полезны

Спасибо

Джулиан

WITH TreeCTE(TreeCode, TreeDesc, depth, TreeParent, TreeID)
AS
(
  -- anchor member
  SELECT cast('' as varchar(50)) as TreeCode , 
   cast('Trees'  as varchar(100)) as TreeDesc, 
   cast('0' as Integer) as depth, 
   cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier) as TreeParent, 
   cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier) as TreeID

  UNION ALL

  -- recursive member
  SELECT s.TreeCode, 
   s.TreeDesc, 
   cte.depth+1, 
   isnull(s.TreeParent, cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier)), 
   isnull(s.TreeID, cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier)) 
  FROM pdTrees AS S
    JOIN TreeCTE AS cte
      ON isnull(s.TreeParent, cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier)) = isnull( cte.TreeID , cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier))
)

-- outer query

SELECT
s.TreeID, s.TreeCode, s.TreeDesc, s.depth, s.TreeParent    
FROM TreeCTE s

person Julian    schedule 15.04.2010    source источник
comment
Вы поставили индекс на свою таблицу?   -  person Robert    schedule 15.04.2010
comment
У меня была такая же проблема несколько раз раньше: |. Вы уверены, что вам нужно отобразить дерево на сервере SQL? Разве вы не можете просто ВЫБРАТЬ строки и отобразить их в простом скрипте (и кэшировать результаты)?   -  person Fredrik Johansson    schedule 27.05.2010


Ответы (2)


Взгляните на тип данных HIerarchyID - это сделано именно для этого.

Кроме того, ваша рекурсия - худший способ справиться с этим. Вы должны войти в это процедурно, возможно, агрегируя данные во временную таблицу по мере необходимости. Или - просто забудьте об этом. Серьезно - Древовидные структуры должны быть выставлены не при запуске программы, а по требованию, 23.000 элементов просто не должны загружаться без надобности.

ЭТО ВСЕ ЕЩЕ говорится - 2:30 минут тоже слишком долго. Для чего-то, что должно быть вычислено в памяти. Вы уверены, что у вас есть правильные индексы в ваших таблицах? Можете ли вы опубликовать план запроса для приведенного выше запроса, чтобы мы могли проверить? Мне кажется, что вы столкнулись с проблемой дизайна SQL, которая требует большого количества сканирований таблиц.

person TomTom    schedule 15.04.2010

Спасибо. Основная проблема в том, что данные уже существуют и существуют уже давно.

Проблем не было, пока босс не попросил, чтобы основной родитель (т.е. root + 1) отображался для каждого элемента при отображении на экране. Когда в режиме дерева это не проблема, поскольку он загружает узлы по требованию, это когда мне нужно перечислить выбранные нет (т.е. 90+) с их основным родителем.

В настоящее время один из «выпускников» использует временные таблицы и просматривает родительскую таблицу с помощью paent, пока не будут найдены правильные, это заняло около 30 секунд на узел.

Я пытаюсь придумать лучший способ получить эту информацию без переделки таблиц и последующего развертывания сценариев изменений для всех клиентов.

даже плохо, что нам не нужно отображать главного родителя при поиске по ajax-файлу, поэтому он должен быть очень быстрым ‹ 1 секунда! как мы фильтруем, как вы печатаете.

Похоже, мне придется изменить дизайн таблиц :(

Также я думаю, что у меня будут те же проблемы с GeoPlantData, который содержит более 8,5 млн строк !!!!

Спасибо за информацию

Джулиан

person Jules    schedule 15.04.2010