쿼리 계산 최적화

쿼리에 필요한 계산을 평가할 때는 필요한 작업의 양을 고려하세요. CPU 시간이 얼만큼 필요한가요? 추가 CPU 리소스가 필요한 자바스크립트 사용자 정의 함수와 같은 함수를 사용하나요?

다음 권장사항은 쿼리 계산을 위한 안내를 제공합니다.

SQL 쿼리를 통해 반복적인 데이터 변환 피하기

권장사항: SQL을 사용하여 ETL 작업을 수행하는 경우 동일한 데이터를 반복적으로 변환하는 상황을 피하세요.

예를 들어 SQL을 사용하여 문자열을 자르거나 정규 표현식을 사용하여 데이터를 추출하는 경우 변환된 결과를 대상 테이블에 구체화하는 것이 성능에 더 유리합니다. 정규 표현식과 같은 함수에는 부가적인 계산이 필요합니다. 부가적인 계산 오버헤드 없이 대상 표를 쿼리하는 편이 훨씬 더 효율적입니다.

자바스크립트 사용자 정의 함수 피하기

권장사항: 자바스크립트 사용자 정의 함수 사용을 피하세요. 네이티브 UDF를 대신 사용하세요.

자바스크립트 UDF 호출에는 하위 프로세스의 인스턴스화가 필요합니다. 이 프로세스를 가동하고 직접 UDF를 실행하는 것은 쿼리 성능에 영향을 미칩니다. 가능한 경우 네이티브(SQL) UDF를 사용하세요.

근사치 집계 함수 사용

권장사항: 사용 사례에서 지원되는 경우 근사치 집계 함수를 사용하세요.

사용 중인 SQL 집계 함수에 해당하는 근사치 함수가 있는 경우 그 근사치 함수가 쿼리 성능을 더 빠르게 해줍니다. 예를 들어 COUNT(DISTINCT) 대신 APPROX_COUNT_DISTINCT()를 사용하세요. 자세한 내용은 표준 SQL 참조의 근사치 집계 함수를 참조하세요.

또한 HyperLogLog++ 함수를 사용하여 근사치 작업을 수행할 수 있습니다(커스텀 근사치 집계 포함). 자세한 내용은 표준 SQL 참조의 HyperLogLog 함수를 참조하세요.

쿼리 작업 정렬로 성능 최대화

권장사항: 가장 바깥쪽 쿼리 또는 window 절(분석 함수) 내에서만 ORDER BY를 사용하세요. 복잡한 작업은 쿼리 끝에 배치하세요.

데이터를 정렬해야 하는 경우 먼저 필터링하여 정렬해야 할 값의 수를 줄이세요. 데이터를 먼저 정렬하면 필요한 것보다 훨씬 더 많은 데이터를 정렬하게 됩니다. 모든 데이터를 정렬하고 LIMIT 절을 적용하는 것보다 데이터의 하위 집합을 정렬하는 편이 더 좋습니다.

ORDER BY 절을 사용하는 경우 이 절은 가장 바깥쪽 쿼리에만 있어야 합니다. 쿼리 중간에 ORDER BY 절을 배치하면 window(분석) 함수에 사용되는 경우를 제외하고 성능에 큰 영향을 미치게 됩니다.

쿼리를 정렬하는 또 다른 방법은 정규 표현식 및 수학 함수와 같은 복잡한 작업을 쿼리의 끝에 배치하는 것입니다. 마찬가지로 이 방법을 사용하면 복잡한 작업을 수행하기 전에 데이터를 최대한 정리할 수 있습니다.

조인 패턴 최적화

권장사항: 여러 표의 데이터를 조인하는 쿼리에서는 조인 패턴을 최적화하세요. 가장 큰 표부터 시작합니다.

JOIN을 사용하여 쿼리를 만드는 경우 데이터를 병합하는 순서를 고려하세요. 표준 SQL 쿼리 옵티마이저가 어느 표가 조인의 어느 쪽으로 가야 하는지를 판단할 수 있지만 그래도 조인된 표를 적절히 정렬하는 것이 좋습니다. 권장사항은 가장 큰 표를 가장 먼저 배치하고 가장 작은 표를 그 뒤에 둔 다음 점점 크기를 줄여나가는 것입니다.

큰 표가 JOIN의 왼쪽에 있고 작은 표가 JOIN의 오른쪽에 있는 경우 브로드캐스트 조인이 만들어집니다. 브로드캐스트 조인은 작은 표의 모든 데이터를 큰 표를 처리하는 각 슬롯으로 보냅니다. 브로드캐스트 조인을 먼저 수행하는 것이 좋습니다.

JOIN의 테이블 크기를 보려면 테이블 정보 가져오기를 참조하세요.

파티션을 나눈 쿼리 정리

권장사항: 파티션을 나눈 테이블을 쿼리할 때는 _PARTITIONTIME 유사 열을 사용하여 파티션을 필터링하세요.

파티션을 나눈 표를 쿼리할 때는 _PARTITIONTIME 유사 열을 사용하세요. _PARTITIONTIME을 사용해 데이터를 필터링하면 날짜 또는 날짜 범위를 지정할 수 있습니다. 예를 들어 다음 WHERE 절은 _PARTITIONTIME 유사 열을 사용해 2016년 1월 1일부터 2016년 1월 31일 사이의 파티션을 지정합니다.

WHERE _PARTITIONTIME
BETWEEN TIMESTAMP(“20160101”)
    AND TIMESTAMP(“20160131”)

쿼리는 날짜 범위에 의해 지정된 파티션의 데이터만 처리합니다. 파티션을 필터링하면 쿼리 성능을 높이고 비용을 줄일 수 있습니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.