2010-04-15 3 views
0

Я искал какой-то способ извлечения данных из таблицы деревьев, как определено ниже.MS SQL server and Trees

Таблица Дерево Определяется как: -
TreeID UniqueIdentifier
TreeParent UniqueIdentifier
TreeCode VARCHAR (50)
TreeDesc VARCHAR (100)

данных некоторые (23k строк), Родитель Refs обратно в идентификатор в таблице

следующая SQL делает все дерево (занимает Arround 2 мин 30)

мне нужно сделать followin г.

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

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

любые sugestions бы ПОЛЕЗНЫЕ

Благодаря

Джулиан

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 
+0

вы положили индекс на – Robert

+0

я имел такую ​​же проблему вашей таблицы несколько раз, прежде чем: |?. вы _sure_, что вам нужно сделать дерево в сервере SQL вы не можете? просто SELECT строк и рендеринга в простой sc ript (и кешировать результаты)? –

ответ

0

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

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

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

0

Спасибо, Основная проблема заключается в том, что данные alreay существует и сделано в течение длительного времени

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

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

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

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

Я смотрит, как я, возможно, придется перепроектировать таблицы :(

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

Спасибо за инфо

Джулиан