MS SQL сервер и деревья - PullRequest
       17

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

0 голосов
/ 15 апреля 2010

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

Дерево таблиц Определено как: -
Уникальный идентификатор TreeID
TreeParent уникальный идентификатор
TreeCode varchar (50)
TreeDesc varchar (100)

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

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

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

1) Визуализируйте каждый узел дерева с его родителем LVL 1
2) Визуализируйте все узлы, которые имеют описание, которое соответствует TreeDesc, например «SomeText%»
3) Рендеринг всех родительских узлов, которые для одного идентификатора дерева.

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

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

Спасибо

Julian

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

Ответы [ 2 ]

0 голосов
/ 15 апреля 2010

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

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

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

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

даже не удивительно, что нам не нужно отображать основного родителя при поиске с использованием AJAX, так что он должен быть очень быстрым <1 секунда! как мы фильтруем, как вы печатаете. </p>

Я выгляжу так, как будто мне нужно изменить дизайн таблиц: (

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

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

Julian

0 голосов
/ 15 апреля 2010

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

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

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

...