2011-08-25 4 views
3

현재 계층 적 데이터베이스 개체에서 작업을 복사하는 Windows Forms .NET 2.0 응용 프로그램에서 성능을 최적화하려고합니다. 트리의 각 개체는 데이터베이스 테이블의 행에 의해 표현된다데이터베이스에서 다소 큰 서브 트리를 복제하는 실용적인 방법?

Example hierarchical structure

: 여기

은 예시적인 구조이다. 또한 각 객체에 대해 여러 개의 "측면 객체"가 연관되어 있습니다. 예 : 테스트 케이스 객체는

  • 1..N 권한
  • 1..N 첨부
  • 속성 1..N
  • 을 ...

이 "쪽이 -objects "는 별도의 데이터베이스 테이블에 저장됩니다.

복사 나무

응용 프로그램의 사용자는 마우스 오른쪽 버튼을 클릭하고 "복사"다음 트리의 다른 위치에 나중에 붙여 넣기, 트리 요소를 선택할 수 있습니다.

이 작업은 모든 하위 개체와 모든 "하위 개체"를 새 위치로 복사합니다.

데이터베이스 관점에서 보면 복사 할 하위 트리의 크기에 따라 SELECTINSERT 문이 수 백 또는 수 천 개가 될 수 있습니다.

사용자 관점에서 볼 때 UI가 반응하도록 대화 상자가 진행 중입니다. 그 외에도 대부분의 사용자는 "... 간단한 복사 및 붙여 넣기 ..."작업을 수행하는 데 너무 오래 걸린다 고 불평합니다.

성능 최적화는

그래서 내 목표는 물건을 속도를하는 것입니다.

현재의 알고리즘은 이런 식입니다 :

  1. 는 DB에서 개체를 읽어보십시오.
  2. 이 개체를 DB에 새 항목으로 저장합니다.
  3. 개체의 모든 "side-objects"에 대해 동일한 작업을 수행하십시오.
  4. 개체의 모든 하위 개체에 대해 동일한 작업을 반복적으로 수행합니다. 당신이 상상할 수 있듯이

는 많은 수의 개체에 대해이 신속하게 데이터베이스 작업의 많은 수의 요약.

지금까지 (일괄 처리 작업을 수행하는 방법에 대한 단서가 없었지만 이후에는 어떤 개체에 대해 어떻게 그리고 어떻게 처리 할 것인가?) 궁금한 점이 있었기 때문에 제 질문은 다음과 같습니다.

내 질문

당신이 나에게 상기 한 바와 같이 계층 적으로 관련된 많은 수의 개체를 복제하는 방법에 대한 힌트/패턴/모범 사례를 줄 수 있습니까?

난 당신이 많은 원인이되는 당신의 .NET 응용 프로그램의 모든 복제를하고있는 있으리라 믿고있어

답변

1

(이상적으로 데이터베이스에 독립적 방식으로, 백엔드는 대부분의 경우 마이크로 소프트 SQL 서버 있지만) 데이터베이스 서버 왕복 여행?

먼저 데이터베이스에서 모든 복제 작업을 수행하고 이러한 왕복을 피하십시오. 현재 C# 알고리즘을 SQL로 다시 작성하는 것만으로 재귀 저장 프로 시저를 사용하여 수행중인 작업을 정확하게 수행 할 수 있어야합니다. 성능이 크게 향상됩니다.

나를 똑똑히 말하는 사람이라면 단일 CTE 쿼리를 사용하여 수행 할 수도 있지만 this post은 불가능하다고 생각하는 것 같습니다. 확실히, 나는 당신이 이것을 할 것이고 새로운 id들 사이의 관계를 보존 할 수 없다.

+0

당신의 가정은 맞고 제안은 정말 훌륭하게 들린다! 나는 그 위에 잠을 자고 구현 방법에 대해 생각할 것입니다. 고마워요! –

관련 문제