2017-09-26 10 views
0

안녕하세요 저는 C++에서 BaseX로 작업하며 내 쿼리 성능에 문제가 있습니다. manny XML 파일이있는 데이터베이스가 있지만 예를 들어 그와 같은 csv 파일에서 가져온 XML 파일이 하나 있습니다. BaseX Xquery optimization

<record> 
    <hsn>0005</hsn> 
    <tsn>486</tsn> 
    <factorycode>BMW 3/1</factorycode> 
    <description>318I</description> 
    <power>83</power> 
    <cubiccapacity>1796</cubiccapacity> 
    <typeapprovaldate>19910701</typeapprovaldate> 
    <xxx>1</xxx> 
    <mid>BMW00737</mid> 
</record> 

내가 같은 HSN 및 TSN

for $mid in doc('database')//record 
where $mid/hsn = '0005' and $mid/tsn = '404' 
return $mid/mid 

로 모든 중반를 찾는 간단한 쿼리 문이 문제가 걸리는 것입니다 긴 xml 파일이 많은 레코드에 포함되어 있기 때문이다.

내 쿼리 또는 xml 파일을 최적화 할 수있는 방법이 있습니까? 애트리뷰트 인덱스가 작동 할 수 있다고 생각하지만 데이터베이스에서 사용하는 방법을 모르겠다. http://docs.basex.org/wiki/Indexes

+0

인용 한 Wiki 기사에서 설명한대로 Info View의 출력을 확인 했습니까? –

답변

0

첫 번째로, "길다"는 의미와 보관하는 레코드의 수는 무엇입니까? 길이가 너무 길면 여러 초 또는 분을 의미 할 수도 있고 사용 사례에 비해 너무 길어 50ms를 의미 할 수도 있습니다. 질문 할 때 좀 더 자세하게 설명하십시오.

다음에는 xml에 특성이 없으므로 확실히 특성 색인을 사용하지 않을 것입니다. 텍스트 색인을 사용하려고합니다. 일반적으로 쿼리는이 경우 텍스트 인덱스를 사용하도록 옵티 마이저에 의해 다시 작성되어야하지만 BaseX GUI의 "쿼리 정보"보기를 확인해야합니다. 컴파일 단계 및 최적화 최적화 쿼리에서 인덱스가 사용되는 항목을 확인해야합니다. 아무 것도 표시되지 않으면 어떤 이유로 최적화 프로그램이 인덱스를 결정하지 않았거나 인덱스가 최신이 아니기 때문에 인덱스가 사용되지 않습니다. db:text을 직접 사용할 수 있습니다.

그러나 두 가지 관련이없는 힌트를 제공하겠습니다. 먼저 성능이 걱정되는 경우 //을 사용하지 마십시오. 이것은 자손 또는 자립 단계이며 BaseX가 모든 자손 요소를 살펴야한다는 것을 의미합니다. 대신 특정 경로 (예 : doc('database')/records/record)를 사용하십시오.

또한 $mid/hsn을 쓰지 마십시오. 경로 연산자 사이에 공백을 두는 것이 타당하지 않을 수도 있지만 유효 할 수도 있습니다. 대신 공백을 삭제하고 $mid/hsn을 작성하십시오.