Amazon Redshift 쿼리 설계 모범 사례 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Redshift 쿼리 설계 모범 사례

이 섹션에서는 쿼리 설계 모범 사례에 대한 개요를 제공합니다. 최적의 쿼리 성능과 효율성을 달성하려면이 섹션의 모범 사례를 따르는 것이 좋습니다.

SELECT * FROM 문을 사용하지 마세요.

SELECT * FROM문을 사용하지 않는 것이 좋습니다. 대신 항상 분석을 위한 열을 나열합니다. 이렇게 하면 쿼리 실행 시간이 단축되고 Amazon Redshift Spectrum 쿼리에 대한 스캔 비용이 절감됩니다.

피해야 할 사항의 예

select * from sales;

모범 사례 예제

select sales_date, sales_amt from sales;

쿼리 문제 식별

STL_ALERT_EVENT_LOG 뷰를 확인하여 쿼리와 관련하여 발생할 수 있는 문제를 식별하고 수정하는 것이 좋습니다.

쿼리에 대한 요약 정보 가져오기

SVL_QUERY_SUMMARYSVL_QUERY_REPORT 뷰를 사용하여 쿼리에 대한 요약 정보를 가져오는 것이 좋습니다. 이 정보를 사용하여 쿼리를 최적화할 수 있습니다.

교차 조인 방지

반드시 필요한 경우가 아니면 교차 조인을 사용하지 않는 것이 좋습니다. 조인 조건이 없으면 교차 조인으로 인해 두 테이블의 Cartesian 곱이 생성됩니다. 교차 조인은 일반적으로 중첩 루프 조인(가능한 조인 유형 중 가장 느림)으로 실행됩니다.

피해야 할 사항의 예

select c.c_name, n.n_name from tpch.customer c, tpch.nation n;

모범 사례 예제

select c.c_name, n.n_name from tpch.customer c, join tpch.nation n on n.n_nationkey = c.c_nationkey;

쿼리 조건자에서 함수 방지

쿼리 조건자에서 함수를 사용하지 않는 것이 좋습니다. 함수를 쿼리 조건자에서 사용하면 일반적으로 함수가 각 행에 처리 오버헤드를 추가하고 쿼리의 전체 실행 속도를 늦출 수 있으므로 성능에 부정적인 영향을 미칠 수 있습니다.

피해야 할 사항의 예

select sum(o_totalprice) from tpch.orders where datepart(year, o_orderdate) = 1992;

모범 사례 예제

select sum(o_totalprice) from tpch.orders where o_orderdate between '1992-01-01' and '1992-12-31';

불필요한 캐스트 변환 방지

캐스팅 데이터 유형에는 시간과 리소스가 걸리고 쿼리 실행 속도가 느려지므로 쿼리에 불필요한 캐스팅 변환을 사용하지 않는 것이 좋습니다.

피해야 할 사항의 예

select sum(o_totalprice) from tpch.orders where o_ordertime::date = '1992-01-01';

모범 사례 예제

select sum(o_totalprice) from tpch.orders where o_ordertime between '1992-01-01 00:00:00' and '1992-12-31 23:59:59';

복합 집계에 CASE 표현식 사용

동일한 테이블에서 여러 번 선택하는 대신 CASE 표현식을 사용하여 복잡한 집계를 수행하는 것이 좋습니다.

피해야 할 사항의 예

select sum(sales_amt) as us_sales from sales where country = 'US'; select sum(sales_amt) as ca_sales from sales where country = 'CA';

모범 사례 예제

select sum(case when country = 'US' then sales_amt end) as us_sales, sum(case when country = 'CA' then sales_amt end) as ca_sales from sales;

하위 쿼리 사용

쿼리의 테이블 하나가 조건자 조건에만 사용되고 하위 쿼리가 소수의 행(약 200개 미만)을 반환하는 경우 하위 쿼리를 사용하는 것이 좋습니다.

피해야 할 사항의 예

하위 쿼리가 200개 미만의 행을 반환하는 경우:

select sum(order_amt) as total_sales from sales where region_key IN (select region_key from regions where state = 'CA');

모범 사례 예제

하위 쿼리가 200개 이상의 행을 반환하는 경우:

select sum(o.order_amt) as total_sales from sales o join regions r on r.region_key = o.region_key and r.state = 'CA';

조건자 사용

조건자를 사용하여 데이터 세트를 최대한 제한하는 것이 좋습니다. 조건자는 SQL에서 쿼리에 반환되는 데이터를 필터링하고 제한하는 데 사용됩니다. 조건자에서 조건을 지정하여 지정된 조건에 따라 쿼리 결과에 포함해야 하는 행을 지정할 수 있습니다. 이렇게 하면 관심 있는 데이터만 검색할 수 있으며 쿼리의 효율성과 정확도가 향상됩니다. 자세한 내용은 Amazon Redshift 설명서의 조건을 참조하세요.

조인으로 테이블을 필터링할 조건자 추가

조건자가 동일한 필터를 적용하더라도 조인에 참여하는 테이블을 필터링할 조건자를 추가하는 것이 좋습니다. 조건자를 사용하여 SQL에서 조인으로 테이블을 필터링하면 처리해야 하는 데이터의 양을 줄이고 중간 결과 세트의 크기를 줄여 쿼리 성능을 개선할 수 있습니다. WHERE 절에서 조인 작업 조건을 지정하면 쿼리 실행 엔진이 조인되기 전에 조건과 일치하지 않는 행을 제거할 수 있습니다. 결과적으로 결과 집합이 더 작아지고 쿼리 실행이 더 빨라집니다.

피해야 할 사항의 예

select p.product_name, sum(o.order_amt) from sales o join product p on r.product_key = o.product_key where o.order_date > '2022-01-01';

모범 사례 예제

select p.product_name, sum(o.order_amt) from sales o join product p on p.product_key = o.product_key and p.added_date > '2022-01-01' where o.order_date > '2022-01-01';

조건자에 대해 가장 저렴한 연산자 사용

조건자에서 가능한 가장 저렴한 연산자를 사용합니다. 비교 조건 연산자는 LIKE 연산자보다 선호됩니다. LIKE 연산자는 여전히 SIMILAR TO 또는 POSIX 연산자보다 선호됩니다.

GROUP BY 절에서 정렬 키 사용

쿼리 플래너가 더 효율적인 집계를 사용할 수 있도록 GROUP BY 절에서 정렬 키를 사용합니다. GROUP BY 목록에 정렬 키 열만 포함된 경우 쿼리는 단상 집계에 적합할 수 있으며,이 중 하나는 배포 키이기도 합니다. GROUP BY 목록의 정렬 키 열에는 첫 번째 정렬 키와 정렬 키 순서로 사용할 다른 정렬 키가 포함되어야 합니다.

구체화된 뷰 활용

가능하면 복잡한 코드를 구체화된 보기로 대체하여 쿼리를 다시 작성하면 쿼리 성능이 크게 향상됩니다. 자세한 내용은 Amazon Redshift 설명서의 Amazon Redshift에서 구체화된 뷰 만들기를 참조하세요.

GROUP BY 및 ORDER BY 절의 열에 주의하십시오.

GROUP BYORDER BY 절을 둘 다 사용하는 경우 GROUP BYORDER BY 절 모두 동일한 순서로 열을 배치해야 합니다. 암시적으로 GROUP BY 에서는 데이터를 정렬해야 합니다. ORDER BY 절이 다른 경우 데이터를 두 번 정렬해야 합니다.

피해야 할 사항의 예

select a, b, c, sum(d) from a_table group by b, c, a order by a, b, c

모범 사례 예제

select a, b, c, sum(d) from a_table group by a, b, c order by a, b, c