2010-04-15 160 views
0

我正在尋找某種方式從下面定義的樹形表中提取數據。MS SQL服務器和樹

表樹定義爲: -
TreeID唯一標識符
TreeParent唯一標識符
TreeCode VARCHAR(50)
TreeDesc VARCHAR(100)

數據一些(23K行),父參考文獻放回在表ID

下面的SQL使得整個樹(以防萬一需要2分鐘30)

我需要做的跟隨着G。

1)渲染每個樹節點與它的LVL 1父
2)渲染具有一個匹配像「SomeText%」
3)TreeDesc渲染是用於單個樹ID的所有父節點說明的所有節點。

物品2和3需要2分鐘30,所以這需要更快!
第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 2010-04-15 09:51:55

+0

我有同樣的問題多次:|?你_sure_,你需要渲染SQL Server中的樹不能嗎?只需選擇行並在一個簡單的sc中渲染即可ript(並緩存結果)? – 2010-05-27 12:05:46

回答

0

看一看HIerarchyID數據類型 - 完全是爲了那些東西。

除此之外 - 你的遞歸是關於與之相處的最糟糕的方式。您應該進入該過程,可能會根據需要將數據彙總到臨時表中。或者 - 忘了它。認真 - 樹結構不應該放在程序開始,但按需求,23.000項應該不加載沒有需要。

還是說 - 2:30分也太長了。對於那些在記憶中被計算的東西。你確定你的桌子上有適當的索引嗎?你能否發佈上述查詢的查詢計劃,以便我們檢查?在我看來,你遇到了一個SQL設計問題,這個問題迫使大量的表掃描。

0

感謝,主要的問題是數據alreay存在,並且已經做了很長時間

的是沒有任何問題utill老闆問主父(即根+ 1)將被顯示爲每個項目當顯示在屏幕上時,在樹模式下,當它按需加載節點時,它不是一個問題,當我需要列出選定的noes(即90+)與它們的主父節點時。

當前的'畢業生髮展'使用了臨時表,並通過paent對錶格父母進行了掃描,直到發現了正確的表,直到每個節點花費30秒。

我試圖想出一個更好的方式來獲取這個信息,並重新調整表格,然後必須將更改腳本部署到所有客戶端。

即使我們沒有顯示主要的父母做ajax碎片查找,所以它的速度非常快< 1秒!正如我們在輸入時進行過濾。

我正在尋找像我可能要重新設計的表:(

而且我想我將不得不與GeoPlantData其中包含超過8.5米行同樣的問題!!!!

感謝該信息

朱利安