2010-02-25 3 views
0

새로운 웹 사이트의 백엔드로 db4o를 사용하려고합니다.db4o 인덱싱 문제 - 작동하지 않습니까? 성능이 좋지 않습니까?

나는 현명한 생각으로 약 5k 개의 레코드 (약 7 개의 기본 필드가있는 단 하나의 개체 유형)를 삽입했습니다.

필자가 읽은 블로그 게시물마다 비 자동 속성으로 속성을 설정하고 공용 속성에 노출 된 개인 멤버에 인덱스를 설정하려고했습니다.

쿼리 성능은 정말 좋지 않습니다. 3/4 초 정도 소요되는 간단한 인덱스 검색이 있어야합니다.

내 구현은 다음과 같습니다. 내 '서버'는 정적 싱글 톤으로, 응용 프로그램 인스턴스 당 한 번만 열립니다. 다음

Db4oFactory.Configure().ObjectClass(typeof(MyObject)).ObjectField("_Id").Indexed(true); 
server = Db4oClientServer.OpenServer("DatabseName", 0); 

는 쿼리하기 :

using (var ooDB = server.OpenClient()) 
{ 
    var movieFound = (from MyObject m in ooDB 
        where m.Id == IdToFind 
        select m).FirstOrDefault(); 
} 

을 같은 내 객체로 :

public class MyObject 
{ 
    protected string _Id; 
    public string Id 
    { 
     get { return _Id; } 
     set { _Id = value; } 
    } 
} 

오브젝트의 ID 문자열입니다.

내가 뭘 잘못하고있어!

건배, 데이브

답변

0

나는 잠시 동안 db4o는 사용,하지만 날 여기 파업하면 속성을 조회하고 백업 필드에 인덱스를 만들 수 있다는 것입니다하지 않았습니다. db4o가 관계를 이해하지 못한다면 (그럴 수도 있지만 현재는 의심 스럽습니다) 속성에 액세스하고 쿼리를 평가하기 위해 저장된 인스턴스를 모두 재생성 할 것입니다.

이 종류의 질문에 대한 링크를 게시 할 수 있습니까? 인덱스 설정?

+3

사실 db4o-LINQ 구현은 속성 뒤에있는 필드를 찾습니다. – Gamlor

3

이전 API (버전 7.4, 아직 호환성 유지)와 새 API (버전 7.12)의 불합리한 조합입니다. 구성이 사용되지 않으므로 색인이 작성되지 않습니다.

'Db4oFactory.Configure()'메소드 호출은 이전 API에 속합니다. 이 API는 이전 API 인 'Db4oFactory.OpenServer()'를 사용하여 ObjectContainer를 만들 때만 사용됩니다. 이 전역 구성에는 잠재적 인 문제점이 있습니다. 그래서 나는 그것을 피할 것이다.

이제 새 API를 사용하는 것이 좋습니다. 여기서 구성을 명시 적으로 전달해야합니다. 또한 구성 인터페이스가 더 깨끗합니다. 특히 클라이언트/서버 구성이 분리되어 있습니다. 'Db4oClientServer.NewServerConfiguration()'을 사용하여 새 구성을 만듭니다. 그런 다음 'Db4oClientServer.OpenServer'로 전달합니다. 따라서 귀하의 경우에는 다음과 같습니다 :

 IServerConfiguration cfg = Db4oClientServer.NewServerConfiguration(); 
     cfg.Common.ObjectClass(typeof(MyObject)).ObjectField("_Id").Indexed(true); 

     IObjectServer server = Db4oClientServer.OpenServer(cfg, "DatabseName.db4o", 0); 
+0

안녕하세요, 저는 귀하의 충고를 따랐지만 너무 빨리 말했습니다. 올바르게 작동하는 색인에서 향상된 성능을 얻었을 것이라고 생각했지만 - 이는 데이터베이스를 잘라 버린 사실 때문입니다. - 항목 수가 수천에 가까워지면 쿼리 시간이 기하 급수적으로 증가합니다. 인덱스가 사용되지 않는다는 것을 나에게 알린다. – Dave

+0

안녕하세요. 작동해야합니다. 진단 리스너를 구성 할 수 있습니다. 따라서 색인이 사용되는지 확인할 수 있습니다 : 'cfg.Common.Diagnostic.AddListener (new DiagnosticToConsole()) '를 호출하십시오. db4o는-LINQ - 시스템이 인덱스가 쿼리에 사용되는 등 나는 내 예를 초기화하기 때문에 먼저 LINQ 쿼리에 방법이 더 오래 걸립니다주의하십시오. 20,000 개의 단순한 객체로 약 4-5 밀리 초가 소요됩니다. 색인없이 300 밀리 초. 어쨌든 소스 코드를 업로드했습니다. 그래서 컴퓨터에서 작동하는지 확인할 수 있습니다 : http://www.gamlor.info/files/dotNet/IndexOnStringField.cs – Gamlor

+0

이 작업을하기 위해서는 dbObject에 MyObject 유형의 모든 객체가 있어야합니다. MyObject? – Alex

관련 문제