1

假设表“项目”(大约 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 这么慢?

4

2 回答 2

3

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

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

然后添加以下索引:

CREATE CLUSTERED INDEX Items_Breadth_First ON Items(HierarchyLevel,ItemHierarchyID ) ;
于 2016-02-08T10:26:15.157 回答
1

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

于 2016-02-08T11:15:32.117 回答