我试图在包含大约50,000行的表(dbo。[Message])中实现hierarchyID(未来会大幅增长)。但是,需要30-40秒才能检索到约25个结果。关于SQL Server HierarchyID深度优先性能的问题
为了提供唯一性,根节点是填充符,因此每个后续行都是该虚拟行的子节点。
我需要能够遍历表深度优先,并已取得了HIERARCHYID柱(DBO。[信息] .MessageID)聚类主键,还添加了一个计算SMALLINT(DBO。[信息] .Hierarchy ),它存储节点的级别。
用法:.Net应用程序将hierarchyID值传递到数据库中,我希望能够检索该节点的所有(如果有的话)子节点和父节点(除root之外,因为它是填充符)。
我使用的查询的简化版本:
@MessageID hierarchyID /* passed in from application */
SELECT
m.MessageID, m.MessageComment
FROM
dbo.[Message] as m
WHERE
m.Messageid.IsDescendantOf(@MessageID.GetAncestor((@MessageID.GetLevel()-1))) = 1
ORDER BY
m.MessageID
据我了解,该指数应自动无提示检测。
从搜索论坛我看到人们在处理广度优先索引时使用索引提示,但没有在深度优先的情况下观察到这个应用。对我的情况来说,这是一种相关的方法吗?
我花了这几天试图找到解决这个问题,但无济于事。 我非常感谢任何帮助,因为这是我的第一篇文章,如果这被认为是一个'不好的'问题,我会提前道歉,我已经阅读了MS文档并搜索了无数论坛,但没有遇到简明的描述的具体问题。
顺便说一句,你有的查询?正如所写的,它总是在整个表中选择所有节点。 @ MessageID.GetAncestor(@ MessageID.GetLevel() - 1)'把它一直带到根,然后你选择所有的后裔,这就是......一切。这就是为什么它如此缓慢。 – Aaronaught 2010-04-26 15:01:37
只是为了澄清:我的情况需要使用深度优先索引,对于混淆 (我指的是广度优先,最后只是提供一个人们建议使用索引提示的例子) – ObjectiveCat 2010-04-26 15:03:13