gpt4 book ai didi

sql - 查询数据库中的搜索树

转载 作者:行者123 更新时间:2023-12-01 14:21:44 25 4
gpt4 key购买 nike

我的数据库中有一张表代表一棵树。数据使用nested sets存储。我想编写一个查询来搜索树,并仅返回与模式匹配的节点以及它们的祖先和后代。到目前为止,这是我想出的。

SELECT DISTINCT Node, Parent, Description
FROM Hierarchy
INNER JOIN
(SELECT Lft, Rgt
FROM Hierarchy
WHERE Description LIKE '%SEARCHQUERY%') AS Matches
ON (Hierarchy.Lft <= Matches.Lft AND
Hierarchy.Rgt >= Matches.Rgt) OR
(Hierarchy.Lft >= Matches.Lft AND
Hierarchy.Rgt <= Matches.Rgt)
ORDER BY Description

该查询有效,但是当子查询与许多描述匹配时,它会有点慢。我正在寻找有关如何改善此查询性能的想法。

如果相关,我正在使用Access。

我有空并且愿意更改表的结构以改进此查询。该表有大约8000个节点。在应用程序的整个生命周期中,记录数不会有太大变化。最大深度为五。

常规搜索的性能是可以接受的(返回约200个节点的搜索需要几秒钟的时间),但是在病理情况下,它需要几分钟的时间(例如,如果搜索单个元音,但是即使在这些情况下,子查询也需要较少的时间)比一秒钟执行)。

最佳答案

我可能会偏离原始问题,但现在我开始:

正如评论中所建议的那样,考虑到您可以负担得起重写的费用,您应该研究一种用于树结构建模的不同方法,尤其是考虑到您拥有“固定深度”时,可以用另一种方法进行管理。

Faroult在他的“SQL的艺术”中赞成基于在表示节点所在的“分支”的字符串字段中表示节点位置的方法。 (有关本书的回顾和一些讨论,请参见 this Slashdot thread )。

这是我的意思的 online example -SQL的艺术在本书的整个章节中专门讨论了这一点,比较了三种不同的方法(嵌套集,父子关系表,编码路径字段)并使用了以滑铁卢的军队为例(带有很多查询,例如“列出X将军的所有营”或“找到谁是Y炮兵的指挥官”)。

Faroult对性能非常狂热,整本书是非供应商特定的集合,这些集合关于如何(重新)编写有效的查询非常合理和实用的建议。

关于sql - 查询数据库中的搜索树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com