2017-10-06 2 views
0

이 것은 나를 혼란스럽게 만들고있다. DB2 자체를 사용하는 것이 빠르며 테이블에서 끌어 당기는 것은 빠르지 만, 왜 그들이 잘 작동하지 않는지는 알 수 없습니다. DB2 테이블 또는 서버의 인덱스에 액세스 할 수 없습니다. 내가 쿼리 거의 20 만 그들을 가지고 있기 때문에 하드 코드로 모든 부품 번호를오라클은 로컬 테이블을 DB2 메인 프레임에 연결하기가 느리다.

select 
    PART_NO, 
    APRV_DT, 
    round((CURRENT_DATE - APRV_DT)/365.242199,1) as AGE, 
    rank() over (partition by PART_NO order by APRV_DT asc) rnk, 
    FROM DB2_TABLE 
where PART_NO in 
    ('529711', 
    '627862', 
    '325712', 
    '979257', 
    '168570', 
    '004297') 

는 분명 내가 원하지 않는 :

이 쿼리는 0.017 초 정도 걸립니다.

부품 번호를 남겨 두었습니다. 내 마음 속에서

,이 쿼리는 약 3 초 또는 뭔가를해야 : 문제는 내가 함께이 결합 할 때입니다

select distinct PART_NUMBER from PARTS_REPORT 
where PART_NUMBER in 
    ('529711', 
    '627862', 
    '325712', 
    '979257', 
    '168570', 
    '004297') 

: 나는 같은 6 개 부품 번호를 선택이 쿼리는 1.23 초 정도 걸립니다. 492 초 걸립니다.

select 
    PART_NO, 
    APRV_DT, 
    round((CURRENT_DATE - APRV_DT)/365.242199,1) as AGE, 
    rank() over (partition by PART_NO order by APRV_DT asc) rnk, 
    FROM DB2_TABLE 
where PART_NO in 
(
    select distinct PART_NUMBER from PARTS_REPORT 
    where PART_NUMBER in 
     ('529711', 
     '627862', 
     '325712', 
     '979257', 
     '168570', 
     '004297') 
) 

더 좋은 방법이 있나요? PARTS_REPORT 테이블을 인덱싱해야합니까? 여기 열쇠가 뭐니?

편집 : 모든 200k-ish 부품 번호를 실행하려면 동일한 쿼리가 564 초가 걸립니다. 즉 위에서 실행 한 시간이 걸릴 때까지 걸립니다.

편집 2 : 아래의 사용자가 내가 무슨 일이 일어나고 있는지 알 수있었습니다. 원격 테이블 전체를 내리셔야합니다. 느립니다. 나는 지금 무슨 일이 일어나고 있는지 이해하고 있다고 생각한다. - 고마워. 당신이 전체의 DB2 서버에서 원격으로 실행되도록 쿼리를 명시 적으로 IN 목록을 제공 DB2_TABLE에서 데이터를 반환하는 첫 번째 쿼리에서

: 대답으로 내 의견을 요약

+0

어떤 테이블이 원격이고 어떤 테이블이 로컬인지는 분명하지 않지만 어떤 경우에는 원격 테이블과 ('어디에서 PART_NO'로 할 것인가) 전체 원격 테이블을 보내야하는 로컬 테이블에 가입 할 때 조인이 수행되는 로컬 서버. – mustaccio

+0

DB2_Table은 원격 테이블입니다. 따라서 전체 테이블을 가져 와서 결합해야합니까? 중간 단계와 같이이 문제를 해결할 수있는 방법이 있습니까? – Clint

+0

조인은 어딘가에서 발생해야하므로 원격 테이블을 로컬로 가져 오거나 로컬 테이블 (또는 그 서브 세트)을 원격 서버로 보냅니다.후자는 아마도 더 적은 대역폭을 필요로 할 것입니다. 따라서 Db2 데이터베이스에 대한 충분한 권한이 있으면 임시 테이블을 선언하고 Oracle 테이블의 부품 번호 목록을로드 한 다음 두 개의 원격 테이블에 대한 쿼리를 수행하고 거기에 조인을 현지화합니다 . – mustaccio

답변

2

.

where PART_NO in과 같은 로컬 테이블에서 검색 기준을 검색하려고하면 전체 원격 테이블을 로컬 서버로 보내야하는 원격 테이블과 로컬 테이블을 강제로 조인합니다. 조인이 수행됩니다.

로컬 테이블 (또는 그 서브 세트)을 원격 서버에 보내면 조인을 수행하는 데 대역폭이 덜 필요합니다. 임시 테이블을 선언하고 Oracle 테이블의 부품 번호 목록을로드 한 다음 두 개의 원격 테이블에 대한 쿼리를 수행하고 거기에서 조인을 현지화하여이 작업을 수행 할 수 있습니다.

이미 원격 데이터베이스에서 테이블을 쿼리 할 수있는 권한이 있습니다. DECLARE GLOBAL TEMPORARY TABLE을 실행할 수 있는지 알아보십시오. 기본적으로 정상적인 PUBLIC 이상의 권한은 필요하지 않습니다.