SQL 服务器 2012 IsDescendantOf SLOW

SQL Server 2012 IsDescendantOf SLOW

假设 table 'Items'(大约 1000 条记录)具有以下字段:

ItemID (smallint, primary key)
ItemHierarchyID (HierarchyID)
ItemName (varchar(max))

此查询(仅用于测试目的)大约需要 0 秒:

    SELECT A.*
    FROM Items A, Items B
    WHERE A.ItemID = B.ItemID

    (output: 1011 records)

相反,这另一个需要大约 25 秒:

     SELECT A.*
     FROM Items A, Items B
     WHERE A.ItemHierarchyID.IsDescendantOf(B.ItemHierarchyID) = 1

     (output: 1035 records)

我补充说,其中许多记录的 ItemHierarchyID = NULL。

为什么 IsDescendantOf 这么慢?

广度优先索引可以提高查询性能。将您的 table 定义更改为:

ItemID (smallint, primary key)
ItemHierarchyID (HierarchyID)
HierarchyLevel as ItemHierarchyID.GetLevel()
ItemName (varchar(max))

然后添加以下索引:

CREATE CLUSTERED INDEX Items_Breadth_First ON Items(HierarchyLevel,ItemHierarchyID ) ;

我忘记了 Item ItemHierarchyID 是一个计算列。 的问题所在。对不起。