MS SQL服务器和树

问题描述:

我正在寻找某种方式从下面定义的树形表中提取数据。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

看一看HIerarchyID数据类型 - 完全是为了那些东西。

除此之外 - 你的递归是关于与之相处的最糟糕的方式。您应该进入该过程,可能会根据需要将数据汇总到临时表中。或者 - 忘了它。认真 - 树结构不应该放在程序开始,但按需求,23.000项应该不加载没有需要。

还是说 - 2:30分也太长了。对于那些在记忆中被计算的东西。你确定你的桌子上有适当的索引吗?你能否发布上述查询的查询计划,以便我们检查?在我看来,你遇到了一个SQL设计问题,这个问题迫使大量的表扫描。

感谢,主要的问题是数据alreay存在,并且已经做了很长时间

的是没有任何问题utill老板问主父(即根+ 1)将被显示为每个项目当显示在屏幕上时,在树模式下,当它按需加载节点时,它不是一个问题,当我需要列出选定的noes(即90+)与它们的主父节点时。

当前的'毕业生发展'使用了临时表,并通过paent对表格父母进行了扫描,直到发现了正确的表,直到每个节点花费30秒。

我试图想出一个更好的方式来获取这个信息,并重新调整表格,然后必须将更改脚本部署到所有客户端。

即使我们没有显示主要的父母做ajax碎片查找,所以它的速度非常快< 1秒!正如我们在输入时进行过滤。

我正在寻找像我可能要重新设计的表:(

而且我想我将不得不与GeoPlantData其中包含超过8.5米行同样的问题!!!!

感谢该信息

朱利安