他の 2 つの間で新しい HierarchyID を要求すると、結果が徐々に長くなります。たとえば、2/5.6 と 2/5.7 の間には、2/5.6.1 と他の 4 つのコンポーネント パスしかありません。HierarchyID データ型は 800 バイトに制限されているため、これを永遠に繰り返すことはできません。繰り返しになりますが、整数型も制限されていますが、実際には問題ありません。高さが無制限に大きくならないように、テーブルを定期的に最適化する必要がありますか?
1 に答える
hierarchyid
間の状態 ( など) をまったく使用しないように、新しい ID を「追加」することが「ベスト プラクティス」と見なさ/2/5.6/
れます。クラスター化された主キーである場合、hierarchyid
パフォーマンスが低下し、意志と同様にページ分割が発生しますuniqueidentifier
。
シーケンシャルな子を生成する場合、不足を心配する必要はほとんどありません。親ごとに文字通り何百万もの子供を持つことができます。
hierarchyid
値を生成する方法の例を次に示します。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
UPDATE Hierarchy
SET @LastChild = LastChild = HId.GetDescendant(LastChild, NULL)
WHERE HId = @ParentID
INSERT Hierarchy (HId, ...)
VALUES (@LastChild, ...)
COMMIT
この方法で ID を生成すれば、ID が不足する心配はありませんのでご安心ください。
好奇心のために、簡単なテストを実行して、どれだけ深くまで行けるかを確認しました. テストスクリプトは次のとおりです。
DECLARE
@parent hierarchyid,
@child hierarchyid,
@high hierarchyid,
@cnt int
SET @parent = '/1/'
SET @child = @parent.GetDescendant(NULL, NULL)
SET @cnt = 0
WHILE (@@ERROR = 0)
BEGIN
SET @cnt = @cnt + 1
PRINT CAST(@cnt AS varchar(10)) + ': ' + @child.ToString()
SET @high = @parent.GetDescendant(@child, @high)
SET @child = @parent.GetDescendant(@child, @high)
END
1426 のポイント ネスティング レベルでエラーが発生することがわかります。これは、作成できる「中間」ノードの数の最悪の場合の制限です。最悪の場合は、すべての挿入が 2 つの最も深い間に入ることを意味します。ネストされたノード。
コメントで述べたように、この制限に達するのはかなり難しいですが、それでも試してみるのは良い考えではありません. 実際のバイト長は、使用する「ポイント」が増えるほど長くなり、パフォーマンスが低下します。hierarchyid
がクラスター化インデックスである場合、これによりページ分割によるパフォーマンスが低下します。ノードを親でランク付けしようとしている場合は、代わりにランキング列を使用してください。トランザクションの分離やその他の頭痛の種を心配しなければならないときに行うよりも、後でソートする方が簡単で効率的です。SELECT
INSERT