복붙노트

[HADOOP] 매우 큰 INNER 가입 SQL 쿼리를 분할

HADOOP

매우 큰 INNER 가입 SQL 쿼리를 분할

SQL 쿼리는 내부 조인 유형을 상당히 표준입니다. 예를 들어 모든 N 테이블의 고객 ID를의 존재가 WHERE 기본 ... 입력 쿼리 될 것이라고 볼 수 n 개의 테이블을 비교.

문제는 테이블의 크기가> 1000 만 개 기록되어있다. 데이터베이스는 정규화됩니다. 정규화를 선택할 수 없습니다. 결코 완료하는 데 오래 걸리는하거나 두 쿼리가 완료됩니다.

나는 관련이 있는지 확실하지 않습니다하지만 우리는 쿼리의 다른 유형의 스프링 XD 작업 모듈을 사용하고 있습니다.

나는 시간이 덜 걸리며 그렇다면 단계 / 하위 섹션은 그것이 중단 된 부분에서 계속 실패 있도록 병렬로 실행할 수 있도록 작업의 종류를 분할하는 방법을 모르겠어요.

비슷한 문제를 가진 다른 게시물은 LOOP를 구현하는 등의 데이터베이스 엔진 코드에 가입 외에 다른 방법을 사용하거나 맵리 듀스 또는 하둡을 사용하여, 사용되지 않는 한 제안 중 하나를 나는 그들이이 사용 사례로 보는 가치가 있는지 확실 해요.

작업의 종류에 대한 표준 접근 방식이 무엇인지, 나는 그것이 매우 일반적인 것으로 기대. 나는 어떤 재고 표준 솔루션 또는 명확한 방향을 건너하지 않았기 때문에 접근 조회 잘못된 검색어를 사용하여 수 있습니다.

오히려 비밀 원래 요구했다 :

세 개의 테이블에서 사용할 수있는 고객을 식별 할 세 가지 매우 큰 테이블에 party_id 열을 비교 즉 그것이 세 사이의 동작합니다. SAMPLE1.PARTY_ID 및 SAMPLE2.PARTY_ID 및 SAMPLE3.PARTY_ID

작업이 OR의 경우, 세 개의 테이블에서 사용할 수있는 모든 고객을 선택합니다. SAMPLE1.PARTY_ID 또는 SAMPLE2.PARTY_ID 또는 SAMPLE3.PARTY_ID

필요에 AND / OR 테이블 사이에 사용되는 다음의 비교를 수행 하였다. SAMPLE1.PARTY_ID 및 SAMPLE2.PARTY_ID 또는 SAMPLE3.PARTY_ID

나는이 정의와 함께 일부 4 테스트 테이블을 각각 설정

CREATE TABLE `TABLE1` (
  `CREATED` datetime DEFAULT NULL,
  `PARTY_ID` varchar(45) NOT NULL,
  `GROUP_ID` varchar(45) NOT NULL,
  `SEQUENCE_ID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`SEQUENCE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=978536 DEFAULT CHARSET=latin1;

그런 다음 조인 발생한다 범위에서 각 무작위 번호 1,000,000 기록을 추가했다.

나는 다음 테스트 쿼리를 사용

SELECT `TABLE1`.`PARTY_ID` AS `pi1`, `TABLE2`.`PARTY_ID` AS `pi2`, `TABLE3`.`PARTY_ID` AS `pi3`, `TABLE4`.`PARTY_ID` AS `pi4` FROM `devt1`.`TABLE2` AS `TABLE2`, `devt1`.`TABLE1` AS `TABLE1`, `devt1`.`TABLE3` AS `TABLE3`, `devt1`.`TABLE4` AS `TABLE4` WHERE `TABLE2`.`PARTY_ID` = `TABLE1`.`PARTY_ID` AND `TABLE3`.`PARTY_ID` = `TABLE2`.`PARTY_ID` AND `TABLE4`.`PARTY_ID` = `TABLE3`.`PARTY_ID`

10 분 이내에 완료하기로하고 테이블 10 배 더 큰 크기입니다. 내 테스트 쿼리는 아직 완료되지 않은 그것은 15 분 실행 된

해결법

  1. ==============================

    1.다음은 기존의 가입 기반 쿼리보다 더 나은 수행 할 수 있습니다 :

    다음은 기존의 가입 기반 쿼리보다 더 나은 수행 할 수 있습니다 :

    select party_id from
    (select distinct party_id from SAMPLE1 union all
     select distinct party_id from SAMPLE2 union all
     select distinct party_id from SAMPLE3) as ilv
    group by party_id 
    having count(*) = 3
    

    테이블의 번호가 조회되는 일치하는 수 (*) 조건을 개정.

    오히려 모든보다 테이블에 존재 party_id 값을 반환 할 경우, 최종 가진 절을 생략합니다.

  2. from https://stackoverflow.com/questions/32620437/partition-a-very-large-inner-join-sql-query by cc-by-sa and MIT license