,SELECT @tmpIds=Pids FROM ELanizationanization WHERE ID='43cdca91ef923f4';。">

我们需要把,SQL中树形分层数据的查询优化

时间:2016-05-11 作者:郑彬晨 阅读:2614次

  我们需要把,SQL中树形分层数据的查询优化   Helvetica,Arial,

  在数据查询中,从2008开始SQL Server提供了一个新的数据类型hierarchyid,专门用来操作层次型数据结构。   

  hierarchyid 类型对层次结构树中有关单个节点的信息进行逻辑编码的方法是:对从树的根目录到该节点的路径进行编码。   

  这种路径在逻辑上表示为一个在根之后被访问的所有子级的节点标签序列。 表示形式以一条斜杠开头,只访问根的路径由单条斜杠表示。 对于根以下的各级,各标签编码为由点分隔的整数序列。 子级之间的比较就是按字典顺序比较由点分隔的整数序列。 每个级别后面紧跟着一个斜杠。 因此斜杠将父级与其子级分隔开。 例如,以下是长度分别为 1 级、2 级、2 级、3 级和 3 级的有效 hierarchyid 路径:   

  

  

  

  

  

  在没有hierarchyid的日子里,我们通过CTE的方式来查询父以及全部的下级,但是,数据量多的情况下,CTE的方式将会变的很慢,后来,我们通过构造PATH的方式来加快速度。那么,有了hierarchyid类型后,自然得使用hierarchyid了。   

  现在,通过一个实际的例子来看看hierarchyid的威力。   

  

  

  

  

  看来CTE方式已经到了不能容忍的地步,那么,现在,我们就用它来进行优化。   

  

  

  首先,我们得新建该字段,然后为其赋值,   

  create function f_cidname) returns varchar as
  select @pids=convert,Convert, id))) + '/'+ @pids from cte
  

  

  UPDATE ELanizationanization SET PIDS=_cidname   

  注意,id是guid的32位字符串,而hierarchyid字段不支持那么大的Path内路径,于是我们将GUID转为了整型:convert,Convert, id)))   

  

  

  注意,极有可能我们把字段更新上去后,我们的程序却出错了,如上。这个时候,我们需要把   

  C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\   

  这个DLL打包到我们的应用程序中去。原因不解释了。   

  

  DECLARE @tmpIds hierarchyid
  SELECT @tmpIds=Pids FROM ELanizationanization WHERE ID='43cdca91ef923f4';
  

  

  

  现在,既然,增加了一个字段,我们就要维护这个字段,如:本条记录在应用程序中被移动到了别的父级下,就需要更新这个字段。为了不动上层代码,唯一能做的就是创建触发器,即:原有的ParentId变动的时候,就需要更新这个PIds字段,于是,我们创建触发器如下:   

  select @tmpId=id from inserted
  update ELanizationanization set pids=_cidname
  因此斜杠将父级与其子级分隔开,sans-serif;font-size:14px;background-color:#FFFFFF;">,
相关教程