2014-09-02 4 views
0

메인 프레임 Db2를 사용 중입니다. 그것의 환자 데이터베이스. 내 요구 사항은 3 개의 테이블, TABACC, TABPAY 및 TABINS에서 다른 정보를 가져 오는 것입니다. TABACC는 항상 환자를위한 행을 갖지만 TABPAY 및 TABINS는 시스템에서 환자의 행을 포함 할 수도 있고 가지지 않을 수도 있습니다.외부 조인 대 개별 쿼리 DB2

어느 쪽이 더 효율적일까요? LEFT OUTER JOIN to TABPAY 및 TABINS 또는 각각의 TABACC, TABPAY 및 TABINS에 대해 하나씩 다른 세 가지 쿼리가있는 TABACC의 QUERY가 더 효율적입니다.

+0

환자가 한 가지 이상을 의미한다는 것을 알고 있습니까? TABAC와 TABINS에 데이터가 없다는 것을 TABACC에서 직관 할 수 없다면 JOIN이 더 효율적일 것입니다. 작은 프로그램을 설정하고 테스트하십시오. –

+1

가게에서 우유, 계란, 빵을 가져와야합니다. 가방을 사거나, 상점에 가서 한 번에 세 가지 항목을 모두 얻거나, 한 번만 항목을 검색 할 때 가게를 3 번 ​​따로 방문하는 것이 더 효율적입니까? –

답변

0

3 개의 테이블에서 1 개의 행 데이터를 가져 오는 것이 모두 가능하다면 COBOL의 임의 읽기를 이길 수 없습니다. 단순히 오버 헤드가 적습니다. SQL은 마술이 아닙니다.

하지만 파일에 쓰는 것을 언급합니다. 따라서 파일에서 100, 1,000 또는 심지어 수백만 행을 가져 와서 새 파일로 출력한다고 가정하십시오.

행별로 작업하는 대신 COBOL의 유일한 옵션이며 SQL을 사용할 때 너무 자주 사용됩니다. 당신은 SQL에서 전체 세트로 작업 할 수 있습니다

insert into newtable 
    (SELECT TB1.COL1, 
      TB2.COL4, 
      TB3.COL5, 
      TB4.COL6 
    FROM TB1 JOIN TB2 ON TB1.KEY = TB2.KEY 
    LEFT OUTER JOIN TB3 ON TB1.KEY = TB3.KEY 
    LEFT OUTER JOIN TB4 ON TB1.KEY = TB4.KEY) 

이제 SQL 솔루션은 훨씬 더 빨라야합니다.

SQL의 핵심은 세트로 생각하는 것입니다. 행마다 (커서를 사용하는) 행을 수행하는 경우에는 항상 잘못된 것이 있습니다 (항상 그런 것은 아닙니다).

COBOL의 기본 I/O에서 SQL로 간단하게 변경할 수 없으며 더 나은 성능을 기대할 수 있습니다. 사실 더 나빠질 것입니다.

마지막으로 출력 파일이 사용되는 대상을 고려하십시오. 데이터를 외부 시스템으로 내보내는 경우 꽤 많이 수행됩니다. 그러나 다른 COBOL 프로그램에 대한 작업 파일을 작성하여 처리하는 경우 ... 더 나은 개선 기회가있을 것입니다. 전체 프로세스를 살펴보고 전체적으로 수행되는 작업과 세트 기반 SQL 솔루션이 수행 할 수있는 작업을 고려하십시오.

+0

나는 OP가 두 개의 조인과 별도의 SQL qeries에 대해 하나의 SQL 쿼리에 대해 묻고 있다고 생각합니다. 원시 COBOL은 전혀 없습니다. –

+0

그래, 아마 맞을거야. 그러나 원래 3 개의 기본 I/O가있는 순수한 COBOL 프로세스가 있다면 그것은 놀랄 일이 아닙니다. 그래서 나는 내 대답을 떠날거야. – Charles

+0

감사합니다. @Charles. 그것은 내가 찾고 있었던 것이다. – user3104950

0

간단히 넣을 수 있습니다. 행이

SELECT TB1.COL1, 
     TB2.COL4, 
     TB3.COL5, 
     TB4.COL6 
FROM TB1 JOIN TB2 ON TB1.KEY = TB2.KEY 
LEFT OUTER JOIN TB3 ON TB1.KEY = TB3.KEY 
LEFT OUTER JOIN TB4 ON TB1.KEY = TB4.KEY; 
+0

예 제가 언급 한 것처럼 단일 쿼리를 작성할 수 있다는 것을 알고 있습니다. 그러나 제 질문은 3 가지 다른 쿼리를 작성하고 함께 출력하는 것보다 속도 측면에서 더 효과적일까요? COBOL에서는 데이터를 변수로 가져 와서 보존 한 다음 함께 파일에 기록 할 수 있습니다. – user3104950

+1

세 개의 SQL이 아닌 조인을 사용합니다. – SriniV

0

당신이이보다 효율적인 방법입니다 다음 색인에 가입되어있는 열 만약 발견하면 TB3는 TB4는 NULL를 반환합니다.

+1

인덱스가 지정되지 않은 경우 조인이 가장 효율적입니다. –