쿼리 계획 평가 - Amazon Redshift

쿼리 계획 평가

쿼리 계획을 사용하여 분산 스타일을 최적화하는 데 적합한 테이블 후보를 식별할 수 있습니다.

초기 설계 의사결정을 마친 후에는 테이블을 생성하여 데이터를 로드하고 나서 테이블을 테스트합니다. 테스트 데이터 세트는 실제 데이터에 최대한 가까운 것으로 사용합니다. 비교 기준으로 사용할 로드 시간을 측정합니다.

가장 비용이 높은 쿼리 중에서도 실행하려고 하는 대표적인 쿼리, 특히 조인 및 집계를 사용하는 쿼리를 평가합니다. 다양한 설계 옵션에 따라 런타임을 비교합니다. 런타임을 비교할 때 첫 번째로 실행하는 쿼리는 제외하세요. 첫 번째 런타임에는 컴파일 시간이 포함되어 있기 때문입니다.

DS_DIST_NONE

해당하는 조각이 컴퓨팅 노드에 공동 배치되기 때문에 재분산이 필요 없습니다. 일반적으로 팩트 테이블과 차원 테이블 1개 사이의 조인을 의미하는 DS_DIST_NONE 단계는 한 번만 있습니다.

DS_DIST_ALL_NONE

내부 조인 테이블이 DISTSTYLE ALL을 사용했기 때문에 재분산이 필요 없습니다. 전체 테이블이 모든 노드에 배치됩니다.

DS_DIST_INNER

내부 테이블이 재분산됩니다.

DS_DIST_OUTER

외부 테이블이 재분산됩니다.

DS_BCAST_INNER

전체 내부 테이블의 복사본이 모든 컴퓨팅 노드로 브로드캐스팅됩니다.

DS_DIST_ALL_INNER

외부 테이블이 DISTSTYLE ALL을 사용하기 때문에 내부 테이블 전체가 단일 조각으로 재분산됩니다.

DS_DIST_BOTH

두 테이블 모두 재분산됩니다.

DS_DIST_NONE과 DS_DIST_ALL_NONE은 유효합니다. 두 옵션은 모든 조인이 공동 배치되기 때문에 해당 단계에서 분산이 필요 없었다는 것을 의미합니다.

DS_DIST_INNER는 내부 테이블이 노드로 재분산되기 때문에 비교적 높은 비용의 단계가 될 것이라는 것을 의미합니다. 또한 외부 테이블이 이미 조인 키를 기준으로 적절하게 분산된다는 것을 나타내기도 합니다. 이 옵션을 DS_DIST_NONE으로 변환하려면 내부 테이블의 분산 키를 조인 키로 설정하십시오. 경우에 따라 외부 테이블이 조인 키에 배포되지 않기 때문에 조인 키에 내부 테이블을 배포할 수 없습니다. 이 경우 내부 테이블에 대해 ALL 분포를 사용할지 여부를 평가합니다. 테이블 업데이트가 자주 또는 광범위하게 이루어지지 않는 동시에 높은 재배포 비용을 감당할 정도로 충분히 크다면 배포 스타일을 ALL로 변경하고 다시 테스트합니다. ALL 분산은 로드 시간의 증가를 유발합니다. 따라서 다시 테스트할 때는 평가 요인에 로드 시간도 추가해야 합니다.

DS_DIST_ALL_INNER는 유효하지 않습니다. 이 옵션은 외부 테이블이 DISTSTYLE ALL을 사용하기 때문에 전체 외부 테이블의 복사본이 각 노드에 배치될 수 있도록 내부 테이블 전체가 단일 조각으로 재분산된다는 의미입니다. 이렇게 되면 모든 노드를 통한 병렬 런타임을 이용하는 대신 단일 노드를 통한 조인의 직렬 런타임이라는 비효율적인 결과가 발생합니다. DISTSTYLE ALL은 오직 내부 조인 테이블에서만 사용해야 합니다. 대신에 외부 테이블에서는 분산 키를 지정하거나 EVEN 분산을 사용하십시오.

DS_BCAST_INNER와 DS_DIST_BOTH는 유효하지 않습니다. 일반적으로 테이블이 분산 키를 기준으로 조인되지 않아서 이러한 재분산이 일어납니다. 팩트 테이블에 아직 분산 키가 없는 경우에는 조인 열을 두 테이블의 분산 키로 지정하십시오. 팩트 테이블의 다른 열에 이미 재분산 키가 있는 경우에는 이 조인의 공동 배치를 위한 분산 키 변경이 전체 성능 개선에 도움이 되는지 평가합니다. 외부 테이블의 분산 키 변경이 최적의 선택이 아니라면 DISTSTYLE ALL을 내부 테이블에 지정하여 공동 배치를 사용할 수 있습니다.

다음은 DS_BCAST_INNER 및 DS_DIST_NONE 레이블을 포함한 쿼리 계획의 일부를 나타낸 예입니다.

-> XN Hash Join DS_BCAST_INNER (cost=112.50..3272334142.59 rows=170771 width=84) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Hash Join DS_BCAST_INNER (cost=109.98..3167290276.71 rows=172456 width=47) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6286.47 rows=172456 width=30) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=14) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=24)

DISTSTYLE ALL을 사용하도록 차원 테이블을 변경하고 나면 아래와 같이 동일한 쿼리에 대한 쿼리 계획에서 DS_BCAST_INNER가 DS_DIST_ALL_NONE으로 바뀐 것을 알 수 있습니다. 또한 조인 단계의 상대적 비용에도 커다란 변화가 있습니다. 총 비용은 14142.59이며, 이전 쿼리의 경우 3272334142.59였습니다.

-> XN Hash Join DS_DIST_ALL_NONE (cost=112.50..14142.59 rows=170771 width=84) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Hash Join DS_DIST_ALL_NONE (cost=109.98..10276.71 rows=172456 width=47) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6286.47 rows=172456 width=30) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=14) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=24)