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

2024-03-25

我正在尝试在包含大约 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

据我了解,索引应该在没有提示的情况下自动检测。

在搜索论坛中,我看到人们在处理广度优先索引时使用索引提示,但没有在深度优先情况下观察到此应用程序。这是否适合我的场景?

这几天我一直在尝试寻找解决这个问题的方法,但没有成功。 我将非常感谢任何帮助,因为这是我的第一篇文章,如果这被认为是一个“菜鸟”问题,我提前表示歉意,我已经阅读了 MS 文档并搜索了无数论坛,但没有找到简洁的描述具体问题。


目前尚不完全清楚您是要针对深度优先搜索还是广度优先搜索进行优化;问题建议深度优先,但最后的评论是关于广度优先的。

您拥有深度优先所需的所有索引(只需索引hierarchyid柱子)。对于广度优先,仅仅create计算出的level列,您也必须对其进行索引:

ALTER TABLE Message
ADD [Level] AS MessageID.GetLevel()

CREATE INDEX IX_Message_BreadthFirst
ON Message (Level, MessageID)
INCLUDE (...)

(请注意,对于非聚集索引,您很可能需要INCLUDE- 否则,SQL Server 可能会采取聚集索引扫描的方式。)

现在,如果你想找到所有祖先对于一个节点,您需要采取稍微不同的策略。您可以闪电般地进行这些搜索,因为 - 这就是最酷的地方hierarchyid- 每个节点已经“包含”其所有祖先。

我使用 CLR 函数来尽可能快地完成此操作,但您可以使用递归 CTE 来完成此操作:

CREATE FUNCTION dbo.GetAncestors
(
    @h hierarchyid
)
RETURNS TABLE
AS RETURN
WITH Hierarchy_CTE AS
(
    SELECT @h AS id

    UNION ALL

    SELECT h.id.GetAncestor(1)
    FROM Hierarchy_CTE h
    WHERE h.id <> hierarchyid::GetRoot()
)
SELECT id FROM Hierarchy_CTE

现在,要获取所有祖先和后代,请像这样使用它:

DECLARE @MessageID hierarchyID   /* passed in from application */

SELECT m.MessageID, m.MessageComment 
FROM Message as m
WHERE m.MessageId.IsDescendantOf(@MessageID) = 1
OR m.MessageId IN (SELECT id FROM dbo.GetAncestors(@MessageID.GetAncestor(1)))
ORDER BY m.MessageID

尝试一下 - 这应该可以解决您的性能问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于SQL Server HierarchyID深度优先性能的问题 的相关文章

  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • 如何重命名 SQL Server 中名称中带有方括号的内容?

    我的一张桌子上有一列 周围有方括号 Book Category 我想重命名为Book Category 我尝试了以下查询 sp rename BookPublisher Book Category Book Category COLUMN
  • 产品和变体 - 设计数据库的最佳方法

    描述 商店可以有产品 鞋子 T 恤等 每个产品可以有许多变体 每个变体可以有不同的价格和库存 例如T 恤有不同的颜色和尺寸 颜色 蓝色 尺寸 L 价格 10 美元 库存 5 颜色 蓝色 尺寸 XL 价格 10 美元 库存 10 颜色 白色
  • 如何比较表中最后一个和倒数第二个条目的值?

    我在 Oracle 中有一个名为quotes 的表 其中包含两列 date 和value 我想比较表中最后一个条目和倒数第二个条目的值 在此示例中 我想获取日期13 1 和 11 1在一行中以及每个日期的值之间的差异 10 5 5 报价表
  • 删除重复的 SQL 记录以允许唯一键

    我在 MYSQL 数据库中有一个表 销售 该表理应强制执行唯一约束以防止重复 事实证明 首先删除欺骗并设置约束有点棘手 表结构 简化 id 唯一 autoinc 产品编号 目标是强制product id 的唯一性 我想要应用的重复数据删除策
  • 获取 Postgres 数据库中每个表的行数

    获取数据库中所有表的行数的最有效方法是什么 我正在使用 Postgres 数据库 结果示例 table name row count some table 1 234 foobar 5 678 another table 32 如果您想要特
  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • 如何使用 SQL Server 查询对“版本号”列进行排序

    我想知道我们当中的 SQL 天才是否可以向我伸出援助之手 我有一个专栏VersionNo在表中Versions包含 版本号 值 例如 VersionNo 1 2 3 1 1 10 3 1 1 4 7 2 etc 我正在寻找对此进行排序 但不
  • SQL Server:索引或主键的总大小不能超过 900 字节

    我正在尝试在包含 URL 的列上放置索引 由于 URL 的最大长度超过 2000 个字符 因此我将数据类型设置为 NVARCHAR 3000 当我这样做时 我收到了错误The total size of an index or primar
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • SSIS使用列位置而不是名称导入Excel文档

    我想知道是否可以通过按位置引用列来使用 SSIS 导入 Excel 文档 例如 导入列 A D M AA 等 我问这个问题是因为我需要从第三方加载多个 Excel 文档 每个文档在相应的列中包含相同的数据类型 但每个文档的列名称不同 Tha
  • SQL Server:复制表中的列

    将表中的列中的所有值复制到同一表中的另一列的最简单方法是什么 使用单个语句 如果列具有相同的数据类型 UPDATE
  • Linq 到自定义 SQL

    好的 我有一个带有巨大表的数据库 超过 100 万条记录和 50 多个列 我知道它不是最佳的 但它是我必须处理的 所以我需要运行限制返回数据量的查询 现在我的问题是这样的 我有一些运行并返回数据的自定义查询 用户可以通过选择将生成谓词模板并
  • 如何使用 RODBC 将数据帧保存到数据库生成的主键表

    我想使用 R 脚本将数据框输入到数据库中的现有表中 并且希望数据库中的表具有顺序主键 我的问题是 RODBC 似乎不允许主键约束 这是创建我想要的表的 SQL CREATE TABLE dbo results ID INT IDENTITY
  • Sybase 中神秘的“时间戳”数据类型是什么?

    我最近在工作中发现 Sybase 数据库中的一个表使用 时间戳 类型的列 如果我使用这种神秘的时间戳数据类型创建一个表 如下所示 create table dropme foo timestamp roo int null insert i
  • 如何更新 SQL Server 中 ntext 列中的 XML 字符串?

    有一个包含 2 列的 SQL 表 ID int 和值 ntext 值行中包含各种 xml 字符串 ID Value 1
  • 如何在jOOQ中使用别名

    有人可以指导我如何在 jOOQ 中使用别名吗 我尝试查看 jOOQ 文档 但不清楚 如果可能 请提供示例 Both org jooq Table http www jooq org javadoc latest org jooq Table
  • 有没有类似 ActiveRecord::Migration for .NET 的东西?

    我玩过 ruby on Rails ActiveRecord Migration类 我喜欢保持数据库模式版本化是多么容易 我想在我的 ASP NET 项目中做类似的事情 我想知道是否有人听说过一个可以执行以下操作的工具ActiveRecor
  • SQL:将一个表中的所有记录插入到另一表中,而不指定列

    我想将备份表 foo bk 中的所有记录插入到 foot 表中 而不指定特定的列 如果我尝试这个查询 INSERT INTO foo SELECT FROM foo bk 我会收到错误 插入错误 列名称或提供的值的数量与表定义不匹配 是否可

随机推荐

  • Android中加载数据到TextView

    我有一个像 Yes No Dontknow 这样的 XML 标签 我正在解析 XML 文件并获取数据 现在我需要在单独的 TextView 中显示每个选项 即 是 应显示在一个 TextView 中 否 应显示在另一个 TextView 中
  • C# 构造函数之外的对象构造

    当涉及到设计类以及它们之间的 通信 时 我总是尝试以所有对象构造和组合都在对象构造函数中进行的方式进行设计 我不喜欢从外部进行对象构造和组合的想法 就像其他对象设置属性并调用我的对象上的方法来初始化它一样 当多个对象尝试对您的对象执行此操作
  • 通过javascript选择特定打印机

    我的计算机连接了两台打印机 我可以通过 JavaScript 代码选择特定的打印机吗 无法绕过打印选项 默认打印机由访问者操作系统决定 使用普通的旧 JavaScript 对此无能为力 使用 Flash 或 Java 或许可以实现这一点 但
  • css/ html 帮助制作像容器一样的圆桌

    任何人都可以提供如何创建基于 css 的气泡容器以便 html 进入其中的见解或示例吗 我想做一张圆桌 也就是说 我希望结果看起来像一张桌子 但边缘是圆角的 如果内部也有轻微的梯度就太好了 我在这个网站上找到了一个样本 http www s
  • 使用R中的geom_smooth()在ggplot2图例中混合填充颜色

    使用绘制两条回归曲线时geom smooth in ggplot2 为了fill颜色 图例选择置信区间相交的颜色 我确实认为当重叠区域按比例大于另一个区域时就会出现这种行为 但是我发现这是非常不受欢迎的 因为读者能够推断出 变暗 区域是 C
  • 有条件地填充 voronoi 段/颜色

    我正在尝试根据 d lon 值有条件地为这些 voronoi 段着色 如果是正数 我希望它是绿色的 如果是负数 我希望它是红色的 然而目前它正在将每个段返回为绿色 即使我将 它仍然返回绿色 活生生的例子在这里 https allaffect
  • Visual Studio 2010 是否支持 Sharepoint 2007 开发?

    我注意到在 VS2010 beta 2 中 所有模板仅适用于 Sharepoint 2010 这是真的 如果是这样 VIeWS 1 3 至少可以与 VS2010 一起使用吗 据我记得在 SharePoint 拉斯维加斯会议上的会议 新的 很
  • 如何在 C# 中使用 itextsharp 创建带有泰米尔字体的 PDF 文件?

    我们正在 C 应用程序中通过传递泰米尔语文本 印度语言之一 来创建 pdf 文件 因此 我已经为我的泰米尔语字体安装了 AVVAIYAR TTF 泰米尔语字体之一 字体 但是当我运行下面提到的命令时pgm 创建的pdf文件不包含任何泰米尔字
  • 第一个承诺完成后,Angular $q.all 被调用

    我试图使用 q all 等待所有承诺都得到解决 但它是在第一个承诺完成后调用的 我做错了什么 function sendAudits audits var promises scope sendAudits progress 0 angul
  • 使用 jquery 将列表拆分为大小相等的子列表的最有效方法

    使用 jQuery 分割列表最有效的方法是什么 ul class columnar li li li li ul 分成几个子列表 ul class column1 li li li li ul ul class column2 li li
  • Java 上的 JSON 与 MultiValueMap

    我想构建一个像这样的 JSON Id 33396 Actions Key 5 Value Test Key 6 Value Test 2 我正在使用 MultiValueMap 这是我的代码 MultiValueMap
  • iOS swift 删除 UITableView 单元格分隔符空间

    我正在尝试删除 tableView 分隔符 我通过将分隔符样式设置为 none 来做到这一点 这会删除分隔符 但会在单元格之间留下空间 我的问题是如何消除单元格之间的空间 任何帮助 将不胜感激 In awakeFromNib功能设定UITa
  • 仅使用 C++ 编写的 Android 应用程序

    是否可以仅使用 C 来制作 Android 应用程序 我不懂Java 我尝试过 Visual Studio 2019 方法 但我想我的计算机不足以模拟 Android 手机 如果您有适当的编程工具 您可以使用 C 为 Android 编写代
  • 尝试通过 jni 调用从 java 更改 Windows 鼠标光标图标

    在我的 java 应用程序中 我尝试使用具有透明度的 argb 32 位 bmp 文件更改鼠标光标 我想进行 jni 调用以从 Windows 更改它 因为在 java 中更改光标会给我一个非常糟糕的鼠标光标 所有透明度都是 0x00 或
  • 为什么无符号类型在arm cpu中效率更高?

    我正在阅读手臂手册并提出这个建议 但没有提到原因 为什么无符号类型更快 在 ARMv4 之前 ARM 没有对加载半字和有符号字节的本机支持 要加载有符号的字节 你必须LDRB然后对值进行符号扩展 LSL那就起来吧ASR它回落 这很痛苦所以c
  • 错误:在 docker 容器中导入 Postgres 数据库

    我正在 docker 容器中运行 ruby on Rails 应用程序 我想在 postgres 容器中创建并恢复数据库转储 但是我 以下是我到目前为止所做的事情 1 添加了 bash 脚本 docker entrypoint initdb
  • 登录会话超时后,Spring Security重定向到最后请求的页面

    我已经实现了 Spring Security 来登录我的门户网站 除了一个问题之外 它工作正常 我已将会话超时设置为 5 分钟 一旦发生超时 然后用户单击任何 URL 它将被重定向到注销页面 但是当用户重新认证时 用户直接登陆到最后访问的页
  • F# 基础知识:将 NameValueCollection 转换为漂亮的字符串

    学习 F 的同时尝试做一些有用的事情 所以这是一个基本问题 I have req 这是一个HttpListenerRequest 其中有QueryString属性 有类型System Collections Specialized Name
  • 如何让我的应用程序音频在说话时很好地中断 iPhone 音频

    我的 iOS 7 应用程序会在必要时发出文本声音 我想做的是让用户在我的应用程序运行时收听他的音乐或播客 或任何其他使用音频的应用程序 预期的行为是 当我的应用程序说话时 其他音频会混合或闪避 然后其他音频会立即恢复到初始级别 我尝试了很多
  • 关于SQL Server HierarchyID深度优先性能的问题

    我正在尝试在包含大约 50 000 行 将来会大幅增长 的表 dbo Message 中实现 HierarchyID 然而 检索大约 25 个结果需要 30 40 秒 根节点是一个填充符 以提供唯一性 因此每个后续行都是该虚拟行的子级 我需