2011-09-08 4 views
1

Documentum 응용 프로그램에서 개체를 검색하는 경우 시간이 오래 걸립니다. 우리는 데이터 소스 루시에서 장기 실행 쿼리 옵션을 활성화하지만, 아래 쿼리가 너무 많은 시간이 걸리는 것으로 나타났습니다 : 당신이 테이블을 볼 수 있듯이문서 응용 프로그램에서 장기 실행 쿼리

select all 
    b.r_object_id, dm_repeating1_0.state_name, a.object_name 
from 
    dm_policy_sp a, 
    dm_sysobject_sp b, 
    dm_policy_rp dm_repeating1_0 
where 
    (
     (a.r_object_id=b.r_policy_id) 
     and (dm_repeating1_0.i_state_no=b.r_current_state) 
     and b.r_object_id in (N'a long, long list of IDs') 
     or a.r_object_id in (N'a long, long list of IDs') 
    ) 
    and /* ... */ 

"a"는 정책 테이블과 만있다가 7 기록. "또는"연산자 뒤에 오는 SQL 문에서 테이블 "a"의 100 개 개체 사이에 object_id을 찾습니다! 우리는 쿼리를 실행하고 테이블 "b"(systemObjects)에있는 해당 개체를 검색했으며 해당 개체가 테이블 b에 속한다는 것을 알았습니다!

위의 쿼리에는 약 17 분이 걸립니다. 테이블의 "or"연산자 다음에 테이블의 이름을 b로 변경하면 10 초 밖에 걸리지 않습니다!

이 쿼리가 잘못되었다고 가정합니다. Documentum의 버그인지 또는 Documentum을 잘못 구성했는지 여부는 알 수 없습니다. 우리는이 SQL 또는 관련 구성 요소를 생성하는 DQL을 어디에서 찾을 수 있는지 모른다. 어떤 생각?

+1

당신은 확실 잘못 중첩 된'and' /' 또는'contruction이 의도적인가? – Tomalak

+0

아니요. 관련된 dql 코드를 찾을 수 없습니다! 그러나 객체 목록이 100보다 길지 않습니다. 객체 수가 100보다 많으면 표 "a"에있는 객체가 또 하나 있거나 찾고있을 것입니다! – Govan

+0

첫 번째로, 괄호를''and (b.r_object_id in (...) or a.r_object_id in (...)) '와 같이 배치하십시오. 현재의 방식이 가장 틀리기 때문입니다. – Tomalak

답변

1

Documentum처럼 보입니다. LifecycleNameDataHandler 및 LifecycleDataHandlerHelper 안에 있습니다. 이 클래스들을 디 컴파일하여이 DQL 쿼리를 찾았습니다.

SELECT b.r_object_id, a.state_name, a.object_name FROM dm_policy (모두) a, dm_sysobject (모두) b WHERE b.r_object_id IN (...) 그리고 a. r_object_id = b.r_policy_id AND a.i_state_no = b.r_current_state ENABLE (행 기반)

Documentum Webtop은 LifeCycle 상태 이름 열이있는 DataGrid를 열 때이 DQL 쿼리를 실행합니다.

이 몇 가지 옵션이 있습니다 : 데이터베이스 수준에서

  1. 최적화 쿼리와 다른 방식으로 DQL 쿼리를 DQL (DA에 DQL 테스터 등)
  2. 디 컴파일 클래스 LifecycleDataHandlerHelper에서 테스트 및 재 작성. FORCE_ORDER 또는 다른 것과 같은 힌트를 추가하십시오.
  3. Life Cycles를 전혀 사용하지 않으면이 클래스를 쉽게 비활성화 할 수 있습니다. webcomponent \ app.xml 파일의 com.documentum.webcomponent.library.applylifecycle.LifecycleNameDataHandler 파일은 주석 처리되거나 비활성화되어야합니다.
  4. 삭제 수명주기 상태 이름 (또는 상태 이름)을 눈금에서 삭제하십시오. 어쩌면 사용자가 사용자 정의 그리드에서이 열을 선택했을 수도 있습니다. 사용자가 그리드에서이 열을 삭제하도록 조언 할 수 있습니다.
+0

답변 해 주셔서 감사합니다. 2 년 전이 문제가 있었고 더 이상 문서 작업을하지 않습니다! – Govan

0

난 당신이 질의에 의해 검색 할 정확히 모르겠지만, 다음과 같이 나는 당신의 쿼리가 재 작업 될 수 있다고 생각 :

select all 
    b.r_object_id, dm_repeating1_0.state_name, a.object_name 
from 
    dm_policy_sp a, 
    dm_sysobject_sp b, 
    dm_policy_rp dm_repeating1_0 
where 
    (
     (a.r_object_id=b.r_policy_id) 
     AND dm_repeating1_0.r_object_id=a.r_object_id 
     and (dm_repeating1_0.i_state_no=b.r_current_state) 
     and (b.r_object_id in (...) 
     or a.r_object_id in (...)) 
    ) 
+0

미안하지만, 나는 innatentive했다. 내가 아는 한, 그러한 DQL이 만들어지는 곳을 찾아야합니다. Webtop을 사용합니까? 그렇다면이 쿼리가 실행되는 구성 요소는 무엇입니까? – Sergi