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 是一个计算列。 是 的问题所在。对不起。
假设 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 是一个计算列。 是 的问题所在。对不起。