当前位置: 首页 > 面试题库 >

有关SQL Server HierarchyID深度优先性能的问题

林意蕴
2023-03-14
问题内容

我正在尝试在包含大约50,000行的表(dbo。[Message])中实现hierarchyID(将来会大大增加)。但是,检索大约25个结果需要30-40秒。

根节点是填充符,以提供唯一性,因此,随后的每一行都是该哑行的子级。

我需要能够深度优先遍历表,并让hierarchyID列(dbo。[Message]
.MessageID)成为聚类主键,还添加了计算所得的smallint(dbo。[Message] .Hierarchy),用于存储节点的级别。

用法:一个.Net应用程序通过一个architectureID值传递到数据库中,我希望能够检索该节点的所有(如果有的话)子代和父代(除根之外,因为它是填充符)。

我正在使用的查询的简化版本:

@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文档并搜索了无数论坛,但没有看到对它的简洁描述。具体问题。


问题答案:

在这里找到解决方法:http :
//connect.microsoft.com/SQLServer/feedback/details/532406/performance-issue-
with-hierarchyid-fun-isdescendantof-in-where-
clause#

只是提醒我,我heirarchyID是从应用程序传递过来的,我的目标是检索该值的任何和所有亲戚(祖先和后代)。

在我的特定示例中,我必须在SELECT语句之前添加以下声明:

declare @topNode hierarchyid = (select @messageID.GetAncestor((@messageID.GetLevel()-1)))
declare @topNodeParent hierarchyid = (select @topNode.GetAncestor(1))
declare @leftNode hierarchyid= (select @topNodeParent.GetDescendant (null, @topNode))
declare @rightNode hierarchyid= (select @topNodeParent.GetDescendant (@topNode, null))

WHERE子句已更改为:

messageid.IsDescendantOf(@topNode)=1 AND (messageid > @leftNode ) AND (messageid < @rightNode )

查询性能的提高非常重要:

对于每个传入的结果,查找时间现在平均为20毫秒(从120到420)。

查询25个值时,以前需要25-35秒才能返回所有相关节点(在某些情况下,每个值都有很多亲戚,在某些情况下则没有亲戚)。现在仅需2秒钟。

非常感谢所有在此站点和其他站点上对此问题做出贡献的人。



 类似资料:
  • 图 图是一种数据结构,其中节点可以具有零个或者多个相邻的元素,两个节点之间的连接成为边。节点也可以成为顶点。 邻接表: 邻接表一般采用数组+链表的形式,数组表示各个顶点,链表中的元素表示该顶点与链表中的元素相连,与链表本身的指针没有关系。如上图 数组0 对应的链表1->3->4 表示0这个顶点与1 3 4这个顶点连接 数组1 表示1这个顶点与 0 2 4顶点相连以此类推 邻接矩阵和邻接表的区别 邻

  • 我有一个任务,我必须写一个方法,执行有向图的DFT。以下是有向边: 节点2-->节点4 节点3-->节点5 节点4-->节点5

  • 本文向大家介绍深度优先搜索,包括了深度优先搜索的使用技巧和注意事项,需要的朋友参考一下 图遍历是按某种系统顺序访问图的所有顶点的问题。遍历图主要有两种方法。 广度优先搜索 深度优先搜索 深度优先搜索(DFS)算法从顶点v开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,然后继续处理x的相邻顶点,依此类推。 如果在任何一个顶点上遇到所有相邻顶点都被访问过,则它将回溯直到找到具

  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线

  • 主要内容:非连通图的生成森林,深度优先生成森林,广度优先生成森林前面已经给大家介绍了有关 生成树和生成森林的有关知识,本节来解决对于给定的无向图,如何构建它们相对应的生成树或者生成森林。 其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是图的生成树或者生成森林。 图 1 无向图   例如,图 1 中的无向图是由 V1~V7 的顶点和编号分别为 a~i 的边组成。当使用 深度优先搜索算法时,假设 V1 作为遍历的起始点,涉及到的顶点和边