我试图在一个表(dbo.[Message])中实现hierarchyID,其中包含大约50,000行(将来会大幅增长).但是,检索大约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
Run Code Online (Sandbox Code Playgroud)
根据我的理解,应该在没有提示的情况下自动检测索引.
从搜索论坛我看到人们在处理广度优先索引时使用索引提示,但是在深度优先的情况下没有观察到这个应用程序.这对我的情景来说是一种相关的方法吗?
过去几天我一直试图找到解决这个问题的方法,但无济于事.我非常感谢任何帮助,因为这是我的第一篇文章,我提前道歉,如果这被认为是一个'noobish'问题,我已经阅读了MS文档并搜索了无数论坛,但没有看到简洁的描述具体问题.
我正在为我的CS课程开发一个程序.它模拟了送货公司在机场的活动.
这是一个非常简单的小程序,由一些头文件和源文件以及一个编排模拟的main.cpp源文件组成.
存在某些给定的常数值,例如装运到达的频率,飞机的负载能力,工人处理某些物品所花费的时间等等(均为整数值).我需要在main.cpp中的几个函数中访问这些变量
将main()函数上面的这些声明为const int是合理的,有效地使它们成为全局的,例如
const int kTotalTime = 2000;
const int kPlaneCapacity = 25;
int main(){//...program code}
我知道在大多数情况下都要避免使用全局变量,因为对它们的调用和/或修改位置没有限制,这可能导致意外破坏程序的某些部分,而这些部分又可能难以调试,如以及为将来的代码等引起兼容性问题.然而,由于这些是在整个程序中使用的原始数据类型的只读值,因此它似乎是一种合理的解决方案.此外,它向读取代码的任何人以及编译器明确声明了变量的用途.
问题:我的逻辑有缺陷吗?怎么会这样?全局变量(常量或非常量)何时合理使用?如果这是一个糟糕的解决方案,那么您如何建议声明这些常量只读值?
非常感谢您的宝贵时间!