Кто-нибудь использует HierarchyId в производстве? Это надежно?

21

Кто-нибудь использует HierarchyId в реальном производстве с таблицами разумного размера, более нескольких тысяч строк? Это надежный / производительный? До сих пор я не нашел никого, кто не связан с продавцом, рекомендовал бы это, и Пол Нильсен советует против этого здесь .

Каков ваш опыт использования HierarchyId в реальных производственных системах?

Какие критерии вы использовали, когда выбирали HierarchyId вместо его альтернатив?

Аляска
источник

Ответы:

8

Я реализовал HierarchyID и обнаружил, что он обеспечивает хорошую производительность и прост в использовании.

Я использовал его для сравнительно небольших наборов данных (десятки тысяч строк) с иерархией до 10 веток.

Зачем это использовать? Тип HierarchyID предоставляет несколько вспомогательных методов (например, IsDescendantOf), которые облегчают вашу работу, чем переход на собственный материализованный путь.

Комментарий Пола Нильсена о StackOverflow меня смущает - HierarchyID - это материализованный путь. Я более склонен согласиться с этим комментарием ниже своего ответа.

Лучший вопрос может быть «почему бы не использовать его». Он прост в использовании, предоставляет множество функций, которые вы в противном случае написали бы для себя, и хорошо работает (в моих ограниченных тестах).

Кирк Бродхерст
источник
+1 Как вы обеспечиваете целостность ваших данных? Можете ли вы использовать ограничения, чтобы убедиться, что нет сирот?
АК
3
По памяти можно. Вы должны использовать функцию через HierarchyID, чтобы определить родительское значение, создать постоянный вычисляемый столбец для этого значения, а затем применить ограничение FK между этим значением и родительским.
Кирк Бродхерст
5

Это ответ на вопрос Кирка «почему бы не использовать его (HierarchyId)». По сравнению с материализованным путем, в некоторых важных случаях HierarchyId кажется менее производительным и менее удобным для работы.

Причина проста: цитата из комментария Microsoft к Connect : «Проблема в том, что вызовы CLR, включая методыierarchyID, непрозрачны для оптимизатора запросов. Это сделано специально. Однако это означает, что оценка количества элементов для них иногда может быть весьма неправильно."

С другой стороны, реализация материализованного пути очень проста в первый раз, когда нам нужно это сделать, и в следующий раз, по сути, это задача копирования и вставки. Таким образом, мы получаем более универсальное и более эффективное решение без особых усилий.

Поэтому я полностью согласен с Полом Нильсеном, который написал в своей превосходной книге «Библия Microsoft® SQL Server® 2008» следующее: «Новый HierarchyID не лишен противоречий. Он новый и получает много времени для прессы и демонстраций, но я» Я не уверен, что это проблема, которая нуждается в другом решении. "

Аляска
источник
3

Моя компания использует HeirachyID для прямых продаж, многоуровневого программного обеспечения для маркетинга. Оно работает. Я действительно не делал никакой работы с этим, я просто знаю, что мы используем это.

Самая большая проблема, с которой я столкнулся, заключается в том, что мы выполняем циклы по уровням, а не на основе множества. В этой области это не очень хорошо для нас, но я не уверен, что это проблема с типом или нашей реализацией.

Джек Корбетт
источник
Джек, насколько велики твои столы? Как вы решили использовать HierarchyId вместо его альтернатив?
АК
Поскольку у меня не было включено уведомление по электронной почте, я никогда не видел этот комментарий. Наши таблицы исчисляются сотнями тысяч, а не миллионами. Я не был в компании, когда было принято решение использовать HierarchyID, поэтому я не уверен, почему он был выбран, за исключением того, что было в то время новым способом.
Джек Корбетт
1

Одна проблема с иерархией - вы получаете привязку к поставщику. Но я нашел отличную статью Адама Милаццо о том, как все работает внутри:

http://www.adammil.net/blog/view.php?id=100

Благодаря этому я смог написать скрипт Postgres для преобразования моего набора данных из MSSQL. Также включил его в скрипт, который я написал для импорта базы данных AdventureWorks в Postgres:

https://github.com/lorint/AdventureWorks-for-Postgres

Просто поищите "ierarchyid "в файле install.sql там, и вы скоро найдете ссылки на его преобразование.

Лорин Туэйтс
источник
0

Наша команда внедрила его в производство, сначала производительность была хорошей, через 2 года таблица теперь содержит 430 000 строк, а getroot и getdecendent занимают 3 секунды, обе из них необходимы для вычисления следующего значения Id для вставки записи. Теперь вставка одного поддерева занимает около 16 секунд, что совершенно неприемлемо.

Gavin
источник