2009-06-03 4 views
1

에 대한 가장 빠른 방법을 찾고 있는데, 객체가 있는지 확인하십시오.. 시나리오는 매우 간단합니다. 현재 하드 드라이브를 읽는 디렉토리 도구를 가정합니다. 디렉토리가 발견되면 작성되거나 이미 존재하는 경우 갱신되어야합니다. 이에 대한 길을 가야하는 것입니다NHibernate에서 객체 존재를 쿼리하는 가장 빠른 방법

public static DatabaseDirectory Get(DirectoryInfo dI) 
    { 
     var result = DatabaseController.Session 
         .CreateCriteria(typeof (DatabaseDirectory)) 
         .Add(Restrictions.Eq("FullName", dI.FullName)) 
         .List<DatabaseDirectory>().FirstOrDefault(); 

     if (result == null) 
     { 
      result = new DatabaseDirectory 
         { 
          CreationTime = dI.CreationTime, 
          Existing = dI.Exists, 
          Extension = dI.Extension, 
          FullName = dI.FullName, 
          LastAccessTime = dI.LastAccessTime, 
          LastWriteTime = dI.LastWriteTime, 
          Name = dI.Name 
         }; 
     } 
     return result; 
    } 

:

먼저 생성 부분에만 초점을 수 있습니다

  • 속도
  • 우려의 분리는

무엇에 관해서 마음은 다음과 같습니다 : 스캔은 항상 "전체적으로"수행됩니다. 의미, C 드라이브의 스캔 중에, 나는 새로운 것이 데이터베이스에 추가되는 것을 아는 것입니다 (다른 프로세스에서). 따라서 스캔 전에 기존의 모든 디렉토리를 "캐시"하고 이러한 방식으로 검색하는 것이 좋습니다. 반면에 이것은 파일 (600.000 이상)과 같은 큰 데이터 세트에는 적합하지 않을 수 있습니다 ...

아마도 "인덱스 열"또는 이와 유사한 것을 사용하여 성능을 약간 향상시킬 수 있습니다. 그러나 나는이 주제에 익숙하지 않다. 나는 (전체 SQL로 전환 할 수있다) NHibernate에, 유창함 인터페이스, 자동 매핑 및 SQL Express를 사용하고

: 아무도 일부 참조가있는 경우, 그냥 ... 올바른 방향으로

감사합니다, 크리스

PS를 날 지점

참고 : 주어진 문제에서 경로는 데이터베이스의 ID가 아닙니다. ID는 자동 증분이므로이 요구 사항을 변경할 수 없습니다 (다른 이유). 따라서 실제 질문은 가장 빠른 방법은 "ID를 알 수없는 개체의 존재 여부를 확인하고 해당 개체의 속성 만 확인하십시오"

일괄 처리는 가능한 경우 "C : Testfiles로 시작합니다."와 같은 큰 그룹이지만 문제는 남아 있습니다.이 세트가 얼마나 크게 될지 미리 어떻게 알 수 있습니까? 나는 "최대 1000"을 선택하지 않고이 버퍼링 된 사전을 체크인한다. 왜냐하면 나는 "검색된 디렉토리"옆에있을 수 있기 때문에 ...이 문제가 분명하기를 바란다. 가장 중요한 부분은 버퍼링이 실제로 성능에 많은 영향을 미치고 있다는 것입니다. 그렇다면 PATH와 ID만을 포함하는 사전에 전체 DB를로드하는 것이 의미가 있습니까? (사실 ​​1.000.000 개체가 있더라도 괜찮습니다.)

답변

2

우선 (NH을 사용하는 사람은 누구나) differences between Get, Load, and query에 대한 Ayende의 기사를 읽는 것이 좋습니다.

존재 여부를 확인해야하므로 개체를 선택하는 쿼리 대신 .Get(id)을 사용합니다.

그러나 문제 도메인에 대한 지식을 활용하여 성능을 향상시킬 수 있는지 궁금합니다. 전체 드라이브를 스캔하고 각 디렉토리에서 데이터베이스에 존재하는지 확인하려면 대량 작업을 수행하여 성능을 향상시킬 수 있습니다. 데이터 전송/처리를 더욱 최소화하기 위해 객체 DatabaseDirectory의 PK 만 포함하는 DTO 객체를 만들 수 있습니다.다음과 같이하십시오 :

그런 다음 반환 된 ID 값과 일치하는 요소를 제거하여 존재하지 않는 디렉토리를 가져옵니다. 입력 세트의 크기에 따라 프로세스를 더 작은 배치로 분할해야 할 수도 있습니다 (파일의 경우 거의 확실합니다).

우려 사항을 분리하는 한, 저장소 수준에서 작업을 유지하십시오. 데이터베이스를 업데이트하는 프로세스를 처리하는 컬렉션 (위와 같이하면 Dictionary 일 수도 있음)을 취하는 SyncDirectories과 같은 메서드가 있어야합니다. 그렇게하면 더 높은 애플리케이션 로직이 어떻게 작동하는지에 대해 걱정할 필요가 없으며 향후 더 빠르게 수행 할 수있는 방법을 찾으면 영향을받지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 대량 부분은 흥미 롭습니다.이 부분을 자세히 조사해야합니다. 첫 번째 제안의 문제점 : ID를 모르겠습니다. 경로는 ID가 아니므로 위의 게시물에이 내용을 추가하여 더 명확하게합니다. 답변 해주셔서 감사합니다... –

관련 문제