2014-09-09 5 views
2

Redshift 클러스터에 10 억 개의 행이있는 테이블이 있습니다. 일부 필터를 기반으로 일부 열 값을 업데이트하려고하는 작업이 있습니다. 이 테이블에서 무엇이든 업데이트하는 것은 매우 느립니다. 다음은 그 예이다 : 초 미만의Redshift UPDATE가 금지되어 있습니다.

SELECT col1, col2, col3 
FROM SOMETABLE 
WHERE col1 = 'a value of col1' 
    AND col2 = 12; 

위의 쿼리 반환, 내가 col1col2에 sortkeys을 가지고 있기 때문에. 이 기준을 충족시키는 행은 하나뿐이므로 결과 집합은 단 하나의 행입니다. 그러나 다음을 실행하는 경우 :

UPDATE SOMETABLE 
SET col3 = 20 
WHERE col1 = 'a value of col1' 
    AND col2 = 12; 

이 쿼리에는 알 수없는 시간이 걸립니다 (20 분 후에 중지했습니다). 다시 말하지만, 한 행의 한 열 값을 업데이트해야합니다.

여기에도 설명서를 따르려고했습니다 : http://docs.aws.amazon.com/redshift/latest/dg/merge-specify-a-column-list.html, 메인 테이블을 업데이트하기 위해 임시 스테이징 테이블을 만드는 방법에 대해 이야기했지만 동일한 결과를 얻었습니다.

여기에 무슨 일이 벌어지고 있는지 궁금하십니까?

+0

해당 행에 열린 트랜잭션이 있는지 확인하십시오. SELECT * FROM pg_stat_activity를 실행 해보십시오. 업데이트가 대기 중인지 확인하십시오. – Kuberchaun

+0

@Bob - 방금 확인한대로 대기중인 것으로 보이지 않습니다. – user37760

+0

테이블과 인덱스 정의에 당신이 사용하는 포스트그레스의 버전과 실행하는 명령의 출력을 제공해야합니다. 테이블에 방아쇠가있어? – Kuberchaun

답변

6

당신은 당신이 업데이트하고 테이블의 몇 퍼센트를 언급하지 않았다하지만 Redshift에의 UPDATE는 2 단계 프로세스이므로주의하는 것이 중요합니다 :

  1. 먼저 표시해야합니다 변경됩니다 각 행을 당신은 열 수가 많은 및/또는 행의 큰 숫자를 업데이트하는 경우 삭제
  2. 그런 다음 데이터의 새 버전은 테이블

에서 각 열에 대해 를 작성해야합니다 그러면이 프로세스는 데이터베이스에 대해 매우 노동 집약적 일 수 있습니다.

CREATE TABLE AS 문을 사용하여 새로운 "업데이트 된"버전의 테이블을 만든 다음 기존 테이블을 삭제하고 새 테이블의 이름을 바꾸어 실험 할 수 있습니다. 이렇게하면 완전히 정렬 된 테이블을 남길 수있는 이점이 있습니다.

0

실제로 RedShift는 대량 업데이트 용으로 설계된 것으로 생각하지 않습니다. RedShift는 OLTP 대신 OLAP 용으로 설계되었으며, 업데이트 작업은 RedShift에서 기본적으로 비효율적입니다.

이 사례에서는 TIMESTAMP의 다른 열을 추가하는 동안 UPDATE 대신 INSERT를 수행하고 RedShift를 분석 할 때 중복 가능성을 제거하기 위해 최신 TIMESTAMP를 얻으려면 추가 논리가 필요합니다. 데이터 항목.

+0

적색 변이 주석에는 삽입이 매우 느릴 수 있다는 내용이 포함되어 있습니다. 이것은 해결책이 아닐 수도 있습니다. – Martlark

관련 문제