Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer2005中实现高性能树视图_Sql_Sql Server_Database_Tree - Fatal编程技术网

如何在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级。我发现了这篇关于嵌套集的文章:像本文中描述的嵌套集是我最好的选择吗?谢谢