回答:
HierarchyIDを実装しましたが、優れたパフォーマンスと使いやすいことがわかりました。
階層が最大10ブランチの比較的小さなデータセット(数万行)で使用しました。
使用する理由 HierarchyIDタイプは、IsDescendantOf
独自のマテリアライズドパスをロールするよりもジョブを簡単にする多くのヘルパーメソッド(など)を提供します。
StackOverflowの上のオーバーポール・ニールセンさんのコメントは私に混乱している- hierarchyid型があるマテリアライズドパス。私は彼の答えの下にあるこのコメントにもっと同意したいです。
より良い質問は、「なぜ使用しないのか」です。使い方は簡単で、他の方法では自分で書くことになる多くの機能を提供し、うまく機能します(私の限られたテストでは)。
これは、Kirkの質問「なぜ使用しないのか(HierarchyId)」に対する回答です。実体化されたパスと比較して、いくつかの重要なケースでは、HierarchyIdのパフォーマンスが低下し、操作の利便性が低下しているようです。
理由は単純です:Connectに関するMicrosoftのコメントから引用すると、「問題は、hierarchyIDのメソッドを含むCLR呼び出しがクエリオプティマイザーに対して不透明であるということです。これは仕様によるものです。しかし、違う。"
一方、マテリアライズドパスの実装は、初めて行うときに非常に簡単であり、次回は本質的にコピーアンドペーストのタスクです。そのため、非常に少ない労力で、より汎用性が高くパフォーマンスの高いソリューションが得られます。
ポールニールセンは、「Microsoft®SQLServer®2008 Bible」というタイトルの優れた本で次のように書いています。「新しいHierarchyIDには議論の余地がないわけではありません。別の解決策が必要なのかどうかわからない」
私の会社では、直接販売のマルチレベルマーケティングソフトウェアでHeirachyIDを使用しています。できます。私はそれを実際に使ったことはありませんが、私たちはそれを使っていることを知っています。
私がこれまでに見た最大の問題は、セットベースではなく、ループ形式でレベルを繰り返し処理していることです。その領域では、それは私たちにとって実際にはうまく機能しませんが、それが型またはそれの実装に問題があるかどうかはわかりません。
hierarchyidの1つの問題は、ベンダーのロックインを取得することです。しかし、私はすべてが内部でどのように機能するかについてのAdam Milazzoによる素晴らしい記事を見つけました
http://www.adammil.net/blog/view.php?id=100
これにより、MSSQLからデータセットを変換するPostgresスクリプトを作成できました。また、AdventureWorksデータベースをPostgresにインポートするために作成したスクリプトにそれを含めました。
https://github.com/lorint/AdventureWorks-for-Postgres
そこのinstall.sqlファイルで「hierarchyid」を検索するだけで、すぐに変換への参照が見つかります。