기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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_SUMMARY 및 SVL_QUERY_REPORT 보기를 사용하여 쿼리에 대한 요약 정보를 가져오는 것이 좋습니다. 이 정보를 사용하여 쿼리를 최적화할 수 있습니다.
교차 조인 방지
반드시 필요한 경우가 아니라면 루트로 실행하는 것은 피하는 것이 좋습니다. 교차 조인에는 조인 조건이 없기 때문에 두 테이블의 카테시안 곱이 발생하는 원인이 됩니다. 교차 조인은 일반적으로 중첩 루프 조인으로 실행됩니다(가능한 조인 유형 중에서 속도가 가장 느린 조인).
피해야 할 사항 예제
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 목록에 정렬 키 열만 포함되어 있으면(이중 하나는 분산 키임) 쿼리 실행 시 1단계 집계가 가능합니다. GROUP BY 목록의 정렬 키 열에는 1차 정렬 키, 정렬 키 순서에 사용할 다른 정렬 키를 순서대로 포함해야 합니다.
구체화된 뷰의 장점
가능하면 복잡한 코드를 구체화된 보기로 대체하여 쿼리를 다시 작성하면 쿼리 성능이 크게 향상됩니다. 자세한 내용은 Amazon Redshift 설명서의 Amazon Redshift에서 구체화된 뷰 만들기를 참조하세요.
GROUP BY 및 ORDER BY 절의 열에 주의하세요.
GROUP BY 및 ORDER BY 절을 모두 사용하는 경우 GROUP BY 및 ORDER 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