2010-07-20 2 views
0

저는 카테고리가 있으며이 카테고리에는 무제한 하위 카테고리가 있습니다. 데이터베이스 테이블에서 필드는 ID, UpperID 및 Title입니다.재귀 SQL 요청의 속도 성능

프로그램 (ASP.NET 프로젝트)에서 재귀 메서드를 사용하여 DataTable의 범주 및 해당 하위 범주를 호출하면 성능이 매우 나쁩니다. 많은 사용자가이 애플리케이션을 사용하므로 모든 것이 나 빠지게됩니다. 아마도 모든 범주가 ​​A 캐시 개체로 채워지고 데이터베이스로 이동합니다. 하지만 카테고리 수는 15000 또는 20000입니다. 그래서 나는 좋은 방법이 아니라고 생각합니다.

빠른 성능을 얻으려면 어떻게해야합니까? 제안 사항을 알려 주시겠습니까?

+1

여러분의 SQL-stmt를 알려주세요 :) –

+1

실제로 쿼리를 공유하면 재귀 쿼리를 만들 수 있습니다. DMBS의 종류를 알려주십시오. –

+0

당신은 수학을해야합니다 - 얼마나 많은 사용자가? 메모리에있는 카테고리 객체의 크기는 얼마나됩니까? 얼마만큼의 기억이 있습니까? 이 병목은 얼마나 큰가요? 사용자 별 스레딩 모델을 사용하고 있습니까? 그렇다면 동일한 시스템에 컴패니언 서비스를 구축하고 빠른 프로세스 간 통신 계층을 통해 연결하는 등 단일 인스턴스 인 영구 캐시를 구축 할 수있는 방법이 있습니까? –

답변

1

덕분에 모든,

나는 공통 테이블 식 (CTE) fifty- 쉰 내 솔루션을 찾을 수 있습니다. 빠른 재귀 허용 쿼리.

WITH CatCTE(OID, Name, ParentID) 
AS 
( 
    SELECT OID, Name, ParentID FROM Work.dbo.eaCategory 
    WHERE OID = 0 
     UNION ALL 
    SELECT C.OID, C.Name, C.ParentID FROM Work.dbo.eaCategory C JOIN CatCTE as CTE ON C.ParentID= CTE.OID 
) 
SELECT * FROM CatCTE 
1

caching 또는 다른 메모리 내구성은 관계형 시스템에서이 작업을 수행하는 것보다 훨씬 낫습니다. :) ... 이봐 ... ...

그냥 2 센트!

예 :

var categories = /* method for domain-objects*/.ToDictionary(category => category.ID); 
foreach (var category in categories.Values) 
{ 
    if (!category.ParentCategoryID.HasValue) 
    { 
     continue; 
    } 
    Category parentCategory; 
    if (categories.TryGetValue(category.ParentCategoryID.Value, out parentCategory)) 
    { 
     parentCategory.AddSubCategory(category); 
    } 
} 

et voila ... 귀하의 나무가 준비되었습니다!

편집 : 성능의 병목이 어디
당신이 정확히 알고 ...

당신에게 몇 가지 아이디어, 예를 들어주고 : 데이터베이스 에서

  • 로드
  • 구조체 작성하기
  • 구조체를 쿼리하는 중

데이터베이스에서 로딩 :
그런 다음 한 번로드해야하고 변경 사항 (생성 된 경우)을 얻거나 쿼리를 최적화하기 위해 일부 변경 추적/알림이 있어야합니다! 구조를 구축

:
내가 트리 (탐색 부분)을 만드는 방법은 당신이 Dictionary<TKey, TValue>

쿼리 구조로 할 수있는 wastest입니다 :
난 내 예제에서 사용했던 구조는 List<T>보다 빠릅니다. Dictionary<TKey, TValue>는 위로 키 인덱스를 사용합니다 - 그래서 당신은 키 (IDS)에 대한 int를 사용할 수 있습니다

편집 :

그래서 당신의 DataTable이 문제를 해결하기 위해 사용합니다. 이제 및 DataTable

두 가지 문제가 있습니다. 지금 무엇을 가지고 계십니까? 너 어디서 시작하는거야? 너 진흙 구멍이 어디 있는지 알 수 있니? 우리에게 코드를 줘!

+0

고맙지 만 내 코드는 코드와 같습니다. 20000 개의 카테고리 레코드와 많은 사용자가 있습니다. 그래서 내 문제는 속도입니다. 최상의 성능을 기대합니다. – Murat