2016-02-08 2 views
1

Допустим, что таблица 'Items' (около 1000 записей) имеет следующие поля:SQL Server 2012 IsDescendantOf МЕДЛЕННО

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 настолько медленный?

+0

Проголосовало за переход на DBA.SE –

ответ

0

Я забыл, что пункт ItemHierarchyID это вычисляемый столбец. Это был проблема. Сожалею.

1

Первый индекс ширины может улучшить производительность вашего запроса. Изменить определение таблицы для этого:

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

, а затем добавьте следующий индекс:

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