2017-02-07 1 views
0

나는 50 개의 컬럼을 갖는 정점에 테이블 A를 가지고 있고 20 개의 컬럼을 갖는 임팔라 테이블 B에 테이블 A를 가지고 있습니다. 표 A는 날짜별로 수백만 개의 레코드를 보유하고 있으며 해당 날짜에 대해 하루에 한 번 임팔라에서 레코드를 업데이트하려고합니다. 자바를 사용하여 1 밀리리안 레코드에 대한 컬렉션을 통해 1000 배치를 업데이 트하고 있지만 때로는 더 많은 시간이 걸립니다. 또한 특정 날짜에 A의 새로운 테이블 복사본을 만들고 그 레코드로 업데이트하고 A에 모든 레코드를 다시 삽입하려고 시도했지만 성능 효과는 없습니다.임팔라에서 vertica의 거대한 레코드 업데이트

동일한 작업을 더 짧은 시간에 할 수 있도록하기 위해 가장 좋은 방법은 무엇일까요?

답변

0

임팔라처럼 20 열로 Vertica의 표 B를 만듭니다.

임팔라와 Vertica를 모두 연결하는 Java 프로그램을 빌드하십시오. 이 프로그램에서 벌크는 SELECT * FROM impala.B을 메모리의 배열로 대량 읽어 들인 다음 대상 문에 대한 호스트 변수와 동일한 메모리를 사용합니다. id 경우

는 (50 COL 나타난 A.과 동일한 구조 및 동일한 기본 키 (이상적으로는 하나의 열)과 다음

자르기 스테이징 테이블 INSERT /*+DIRECT */ INTO stg_A SELECT B.*, A.col21,A.col22 .... A.col50 FROM B JOIN A ON stg_A.id=A.id을 준비 테이블 stg_A 생성 (또는 계속) 기본 키). 이렇게하면 20 개의 기둥이 임팔라에서 나오고 나머지는 표적에서 나온 것입니다.

마지막으로, 최적화 된 병합 실행 병합이 (가) 계획을 설명 최적화 된 병합이 INSERT와 DELETE에 대한 완전한 액세스 경로에 대한 완전한 액세스 경로를 가지고

MERGE /*+DIRECT*/ 
INTO A t 
USING stg_A s 
ON s.id   = t.id 
WHEN MATCHED THEN UPDATE SET 
    id = s.id 
, col02 = s.col02 
, col03 = s.col03 
, col04 = s.col04 
, col05 = s.col05 
[...]  
    , col50 = s.col50 
WHEN NOT MATCHED THEN INSERT VALUES (
    s.s.id 
, s.s.col02 
, s.s.col03 
, s.s.col04 
, s.s.col05 
, s.[...] 
, s.s.col50 
); 

당신은 볼 것없이 액세스 MERGE 경로.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 임팔라에서 select *와 같은 다른 방법을 시도해 보았고 vertica temp에 위의 select 열과 같은 열을 사용하여 테이블을 만들고 * 모든 값을 temp에 삽입했습니다. 그런 다음 비슷한 키와 날짜 조건 단일 쿼리에서 조인과 임시 키를 비교하여 Vertica B를 업데이트하십시오. 지금 성능을 확인하는 중입니다 ... –

+0

잘 작동 중 ... 업데이트 날짜 t SET column1 = t.column1 발신자 번호 WHERE ts.column2 = t.column2 AND ts.column3 = t.column3 = t.column3 및 date (ts. column4) = '2017-02-08'; –

+0

최적화 된 MERGE를 사용하면 더 빠를 것입니다. 설명서를 읽으십시오. ... – marcothesane

관련 문제