約50,000行を含むテーブル(dbo。[Message])にhierarchyIDを実装しようとしています(将来大幅に増加します)。ただし、約25件の結果を取得するには30〜40秒かかります。
ルートノードは一意性を提供するためのフィラーであるため、後続のすべての行はそのダミー行の子になります。
テーブルを深さ優先でトラバースできるようにする必要があり、hierarchyID列(dbo。[Message] .MessageID)をクラスタリングの主キーにし、計算されたsmallint(dbo。[Message] .Hierarchy)を追加しました。ノードのレベル。
使用法:.NetアプリケーションはhierarchyID値を介してデータベースに渡され、そのノードのすべての(存在する場合)子と親(フィラーであるため、ルートを除く)を取得できるようにしたいと考えています。
私が使用しているクエリの簡略化されたバージョン:
@MessageID hierarchyID /* passed in from application */
SELECT
m.MessageID, m.MessageComment
FROM
dbo.[Message] as m
WHERE
m.Messageid.IsDescendantOf(@MessageID.GetAncestor((@MessageID.GetLevel()-1))) = 1
ORDER BY
m.MessageID
私の理解では、インデックスはヒントなしで自動的に検出されるはずです。
フォーラムの検索から、幅優先のインデックスを扱うときにインデックスヒントを利用している人々を見てきましたが、深さ優先の状況ではこのアプリケーションを観察していません。それは私のシナリオに関連するアプローチでしょうか?
私は過去数日間、この問題の解決策を見つけようとしていましたが、役に立ちませんでした。助けていただければ幸いです。これが私の最初の投稿であるため、これが「noobish」の質問と見なされる場合は事前に謝罪します。MSのドキュメントを読み、数え切れないほどのフォーラムを検索しましたが、特定の問題。