약 50,000 개의 행을 포함하는 테이블 (dbo. [Message])에 hierarchyID를 구현하려고합니다 (이후 크게 증가 할 것입니다). 그러나 약 25 개의 결과를 검색하는 데 30-40 초가 소요됩니다.SQL Server 계층 구조 깊이 우선 순위 성능에 대한 질문
루트 노드는 고유성을 제공하기위한 필러이므로 모든 후속 행은 그 더미 행의 하위 노드입니다.
우선 테이블 깊이를 탐색 할 수 있어야하며 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 문서를 읽고 무수한 포럼을 수색했지만 간결한 설명 문제의
그건 그렇고, 당신은 가지고있는 쿼리? 작성된 것처럼 항상 테이블 전체에서 모든 노드를 선택합니다. '@ MessageID.GetAncestor (@ MessageID.GetLevel() - 1)'은 루트까지 모든 것을 가져온 다음 자손, 즉 모든 것을 선택합니다. 그래서 너무 느립니다. – Aaronaught
그냥 명확히하기 위해서 : 내 상황은 깊이 우선 색인 생성을 사용해야합니다. 혼란에 대해 유감스럽게 생각합니다. (색인 힌트를 사용하여 사람들이 제안한 예를 제공하기 위해 폭을 먼저 나타냅니다.) – ObjectiveCat