Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 HierarchyID: добавление узла в иерархию  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Или я не так понимаю этот тип данных, или поведение действительно странное

Имеем таблицу Tree 10 млн записей, у нее есть поле hid hierarchyid с построенной иерархией

CREATE TABLE [dbo].[tree](
	[id] [uniqueidentifier] NOT NULL primary key,
	[parent_id] [uniqueidentifier] NULL,
	[name] [nvarchar](128),
	[hid] [hierarchyid] NULL,
	[deleted] [int] NOT NULL DEFAULT ((0)),
	[_level]  AS ([hid].[GetLevel]())
)



Добавляю узел

DECLARE
	@hid            AS HIERARCHYID,
	@parent_hid     AS HIERARCHYID,
	@last_child_hid AS HIERARCHYID

SELECT @parent_hid=hid FROM dbo.tree WHERE id = @parent_id;
SELECT @last_child_hid = MAX(hid) FROM dbo.tree WHERE hid.GetAncestor(1) = @parent_hid; -- <-----!


Что получаю в результате:
Последний запрос выполняется несколько минут и в профайлере миллионы одинаковых записей типа такого

SELECT @last_child_hid = MAX(hid) FROM dbo.tree WHERE hid.GetAncestor(1) = @parent_hid;

причем ObjectName указывается 'hierarchyid', ObjectType='21318 - FS'


Пара вопросов:
1. Он что в лоб сканирует все записи? hierarchyid вообще не выживает на миллионе записей?
2. как добавить узел к паренту скажем справа от уже существующих братьев по-другому за разумное время?
17 окт 14, 15:55    [16721739]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: добавление узла в иерархию  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
а зачем там вычисляемый столбец с GetLevel() ?
мне кажется лучше в запросе получать уроверь иерархии
17 окт 14, 16:00    [16721796]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: добавление узла в иерархию  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Konst_One
а зачем там вычисляемый столбец с GetLevel() ?
мне кажется лучше в запросе получать уроверь иерархии


рекомендуют иметь и индекс по нему для запросов

Я понял ошибку, не надо вестись на рекомендации с выбором MAX(), можно сделать по-другому, используя количество "братанов" и с добавлением номера в путь.

зы. Но все-таки это был сюрпрайз, что такой запрос так мощо сажает производительность и практически его нельзя использовать.
17 окт 14, 16:29    [16722105]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: добавление узла в иерархию  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
новые фичи пока мало кто юзает, поэтому и инфы мало.
17 окт 14, 16:30    [16722121]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: добавление узла в иерархию  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Winnipuh
Или я не так понимаю этот тип данных, или поведение действительно странное

Имеем таблицу Tree 10 млн записей, у нее есть поле hid hierarchyid с построенной иерархией

CREATE TABLE [dbo].[tree](
	[id] [uniqueidentifier] NOT NULL primary key,
	[parent_id] [uniqueidentifier] NULL,
	[name] [nvarchar](128),
	[hid] [hierarchyid] NULL,
	[deleted] [int] NOT NULL DEFAULT ((0)),
	[_level]  AS ([hid].[GetLevel]())
)



Добавляю узел

DECLARE
	@hid            AS HIERARCHYID,
	@parent_hid     AS HIERARCHYID,
	@last_child_hid AS HIERARCHYID

SELECT @parent_hid=hid FROM dbo.tree WHERE id = @parent_id;
SELECT @last_child_hid = MAX(hid) FROM dbo.tree WHERE hid.GetAncestor(1) = @parent_hid; -- <-----!


Что получаю в результате:
Последний запрос выполняется несколько минут и в профайлере миллионы одинаковых записей типа такого

SELECT @last_child_hid = MAX(hid) FROM dbo.tree WHERE hid.GetAncestor(1) = @parent_hid;

причем ObjectName указывается 'hierarchyid', ObjectType='21318 - FS'


Пара вопросов:
1. Он что в лоб сканирует все записи? hierarchyid вообще не выживает на миллионе записей?
2. как добавить узел к паренту скажем справа от уже существующих братьев по-другому за разумное время?



Еще веселее:
при тех же условиях и параметрах такой запрос выполняется быстро и дает 40 записей

SELECT hid FROM dbo.tree WHERE hid.GetAncestor(1) = @parent_hid;
20 окт 14, 12:00    [16730119]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить