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
看一看HIerarchyID数据类型 - 完全是为了那些东西。
除此之外 - 你的递归是关于与之相处的最糟糕的方式。您应该进入该过程,可能会根据需要将数据汇总到临时表中。或者 - 忘了它。认真 - 树结构不应该放在程序开始,但按需求,23.000项应该不加载没有需要。
还是说 - 2:30分也太长了。对于那些在记忆中被计算的东西。你确定你的桌子上有适当的索引吗?你能否发布上述查询的查询计划,以便我们检查?在我看来,你遇到了一个SQL设计问题,这个问题迫使大量的表扫描。
感谢,主要的问题是数据alreay存在,并且已经做了很长时间
的是没有任何问题utill老板问主父(即根+ 1)将被显示为每个项目当显示在屏幕上时,在树模式下,当它按需加载节点时,它不是一个问题,当我需要列出选定的noes(即90+)与它们的主父节点时。
当前的'毕业生发展'使用了临时表,并通过paent对表格父母进行了扫描,直到发现了正确的表,直到每个节点花费30秒。
我试图想出一个更好的方式来获取这个信息,并重新调整表格,然后必须将更改脚本部署到所有客户端。
即使我们没有显示主要的父母做ajax碎片查找,所以它的速度非常快< 1秒!正如我们在输入时进行过滤。
我正在寻找像我可能要重新设计的表:(
而且我想我将不得不与GeoPlantData其中包含超过8.5米行同样的问题!!!!
感谢该信息
朱利安
你以前把索引你的桌子上的 – Robert 2010-04-15 09:51:55
我有同样的问题多次:|?你_sure_,你需要渲染SQL Server中的树不能吗?只需选择行并在一个简单的sc中渲染即可ript(并缓存结果)? – 2010-05-27 12:05:46