【发布时间】:2011-02-12 10:35:50
【问题描述】:
我正在尝试在包含大约 50,000 行的表 (dbo.[Message]) 中实现 hierarchyID(将来会大幅增长)。然而,检索大约 25 个结果需要 30-40 秒。
根节点是为了提供唯一性而填充的,因此每个后续行都是该虚拟行的子节点。
我需要能够深度优先遍历表,并将 hierarchyID 列 (dbo.[Message].MessageID) 设为集群主键,还添加了一个计算 smallint (dbo.[Message].Hierarchy)存储节点的级别。
用法:.Net 应用程序通过 hierarchyID 值传递到数据库中,我希望能够检索该节点的所有(如果有的话)子和父节点(除了根,因为它是填充物)。
我正在使用的查询的简化版本:
@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
据我了解,应该会自动检测索引而无需提示。
从搜索论坛中,我看到人们在处理广度优先索引时使用索引提示,但没有在深度优先的情况下观察到此应用程序。这对我的场景来说是一种相关的方法吗?
过去几天我一直在尝试找到解决此问题的方法,但无济于事。 我将非常感谢任何帮助,因为这是我的第一篇文章,如果这被认为是一个“noobish”问题,我提前道歉,我已经阅读了 MS 文档并搜索了无数论坛,但没有找到简洁的描述具体问题。
【问题讨论】:
-
顺便问一下,您有什么疑问?正如所写,它总是选择整个表中的所有节点。
@MessageID.GetAncestor(@MessageID.GetLevel() - 1)一直到根,然后你选择所有的后代,也就是……一切。这就是它如此缓慢的原因。 -
只是为了澄清一下:我的情况需要使用深度优先索引,抱歉混淆(我最后提到广度优先只是为了提供人们建议使用索引的示例-提示)
标签: sql tsql sql-server-2008 hierarchy hierarchyid