在这里找到解决方法:http ://connect.microsoft.com/sqlServer/Feedback/details/532406/performance-issue- with-hierarchyid-fun-isdescendantof-in-where- clause#
只是提醒我,我heirarchyID
是从应用程序传递过来的,我的目标是检索该值的任何和所有亲戚(祖先和后代)。
在我的特定示例中,我必须在SELECT
语句之前添加以下声明:
declare @topNode hierarchyid = (select @messageID.GetAncestor((@messageID.GetLevel()-1)))
declare @topNodeParent hierarchyid = (select @topNode.GetAncestor(1))
declare @leftNode hierarchyid= (select @topNodeParent.GetDescendant (null, @topNode))
declare @rightNode hierarchyid= (select @topNodeParent.GetDescendant (@topNode, null))
该WHERE
子句已更改为:
messageid.IsDescendantOf(@topNode)=1 AND (messageid > @leftNode ) AND (messageid < @rightNode )
对于每个传入的结果,查找时间现在平均为20毫秒(从120到420)。
查询25个值时,以前需要25-35秒才能返回所有相关节点(在某些情况下,每个值都有很多亲戚,在某些情况下则没有亲戚)。现在仅需2秒钟。