如何在SQLServer2005中实现高性能树视图
构建表示树的表的最佳方法是什么? 我想实现一个选择、插入、更新和删除功能,可以很好地处理大数据。如何在SQLServer2005中实现高性能树视图,sql,sql-server,database,tree,Sql,Sql Server,Database,Tree,构建表示树的表的最佳方法是什么? 我想实现一个选择、插入、更新和删除功能,可以很好地处理大数据。 例如,select必须支持“全部展开”-获取给定节点的所有子节点(以及其中的子节点)。使用CTE 给定树状表结构: id parent name 1 0 Electronics 2 1 TV 3 1 Hi-Fi 4 2 LCD 5 2 Plasma 6 3 Amplifiers 7 3 Speakers ,此查询将
例如,select必须支持“全部展开”-获取给定节点的所有子节点(以及其中的子节点)。使用
CTE
给定树状表结构:
id parent name
1 0 Electronics
2 1 TV
3 1 Hi-Fi
4 2 LCD
5 2 Plasma
6 3 Amplifiers
7 3 Speakers
,此查询将返回id
、parent
和depth-level,按树排序:
WITH v (id, parent, level) AS
(
SELECT id, parent, 1
FROM table
WHERE parent = 0
UNION ALL
SELECT id, parent, v.level + 1
FROM v
JOIN table t
ON t.parent = v.id
)
SELECT *
FROM v
id parent name
1 0 Electronics
2 1 TV
4 2 LCD
5 2 Plasma
3 1 Hi-Fi
6 3 Amplifiers
7 3 Speakers
将parent=0
替换为parent=@parent
,以仅获取树的一个分支
如果在表(父项)
上有一个索引,此查询将有效地处理一个非常大的表,因为它将递归地使用索引查找
查找每个父项的所有子项
要更新某个分支,请发出:
WITH v (id, parent, level) AS
(
SELECT id, parent, 1
FROM table
WHERE parent = 0
UNION ALL
SELECT id, parent, v.level + 1
FROM v
JOIN table t
ON t.parent = v.id
)
UPDATE table t
SET column = newvalue
WHERE t.id IN
(
SELECT id
FROM v
)
其中
@parent
是分支的根。查看解决层次结构问题的多种方法。您选择的模型将取决于您如何权衡查找、更新和复杂性。使用邻接列表模型可以使查找速度非常快(尤其是对于获取节点中的所有子节点),但对树的更新速度较慢。您必须先问自己以下问题:
1) 修改与读取的比率是多少?(=主要是静态树还是不断变化?)
2) 你认为这棵树能长到多深多大
嵌套集对于需要对整个分支进行操作的大多数静态树非常有用。它处理深树没有问题
物化路径适用于深度受限/可预测的动态(变化)树
递归CTE非常适合于非常小的树,但是对于深/大的树,分支操作(“获取此分支中的所有子级…”)的成本非常高。如果您有许多更新和选择,最好的选择似乎是路径枚举模型,下面简要介绍一下:
我很惊讶没有人提到要和一个朋友一起去。阅读效率很高,写起来也很简单。谢谢,我会查的。联合比递归更有效吗?我听说mssql 2005有一种处理树的新方法,你知道它是否能很好地处理大型数据库吗?CTE中的联合是递归的,尽管我不确定SQL Server在幕后是如何处理它的,或者是否有性能调整。我还没有用CTE做足够的大规模测试来确定性能。你能详细说明一下表的结构吗?这个查询能在大型数据库中正常工作吗?谢谢,如何进行深度更新是否更新父节点下的所有节点?(包括孙子孙女)嘿,我正在努力让它工作,而且看起来vq项目不起作用,不过我在2008年试过了。还必须将液位存储在数据库中,因为它没有显示在表中吗?
@optician
:请立即尝试Level
是一个伪列,它是在CTE
中生成和计算的。我的树非常动态,有很多更新,但也有很多选择。我希望能够深入到10-15级。我发现了这篇关于嵌套集的文章:像本文中描述的嵌套集是我最好的选择吗?谢谢