파티션에서 가장 큰 행을 효율적으로 확보하고 중복 테이블 액세스를 방지
데이터 쿼리 분야에서는 특히 대규모 테이블을 처리할 때 효율성이 매우 중요합니다. 일반적인 최적화 과제는 테이블의 각 파티션에 있는 특정 열에서 가장 큰 값을 가진 행을 찾는 것입니다.
SCORES 테이블에서 최신 라운드(ROUND)의 각 ID가 얻은 점수를 가져와야 한다고 가정해 보겠습니다.
ID | ROUND | SCORE |
---|---|---|
1 | 1 | 3 |
1 | 2 | 6 |
1 | 3 | 2 |
2 | 1 | 10 |
2 | 2 | 12 |
3 | 1 | 6 |
초기 방법:
한 가지 방법은 모든 행을 검색한 다음 ID당 최대 ROUND를 나타내지 않는 행을 필터링하는 것입니다.
SELECT * FROM (SELECT id, round, CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score FROM SCORES where id in (1,2,3) ) scorevals WHERE scorevals.round is not null;
이 방법은 효과적이지만 중복된 테이블 스캔으로 인해 비효율적입니다.
최적화 계획:
또 다른 효율적인 방법은 창 함수와 DISTINCT 절을 사용하는 것입니다.
SELECT DISTINCT id ,max(round) OVER (PARTITION BY id) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;
이 방법에서 윈도우 함수max(round) OVER (PARTITION BY id)
는 각 ID에 대한 최대 ROUND를 계산합니다. 그런 다음 창 함수 뒤에 DISTINCT 절을 적용하여 각 ID의 가장 높은 ROUND 행만 반환되도록 합니다. 마지막으로 first_value(score) OVER (PARTITION BY id ORDER BY round DESC)
창 함수는 각 ID에 대해 가장 큰 ROUND와 연관된 첫 번째 SCORE를 검색합니다.
이 최적화된 구성표는 여러 테이블을 스캔하지 않고도 원하는 결과를 달성하여 성능을 크게 향상시킵니다.
위 내용은 다중 테이블 스캔 없이 파티션에서 최대 행을 효율적으로 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!