use-the-index-luke 저자 Markus Winand
---------------------------------------------
Markus Winand는 SQL에 대한 통찰력을 제공하고 다양한 시스템이 SQL을 지원하는 방법을 modern-sql.com 에서 보여줍니다. 이전에 그는 use-the-index-luke.com 을 만들었는데, 지금도 활발하게 유지되고 있습니다. Markus는 winand.at 를 통해 강사, 연사 및 컨설턴트로 고용될 수 있습니다.
---------------------------------------------
You can upload a Korean translation of use-the-index-luke.com on your blog
Thank you from the bottom of my heart to author Makus Winand for allowing me.
These are translations that I use for studying by using a papago (google translate)
The translations may not be correct or there may be a typo.
I'd appreciate it if you could point it out in the comments.
---------------------------------------------
---------------------------------------------
use-the-index-luke.com 의 한글번역본을 블로그에 업로드 해도 된다고
허락해주신 Makus Winand 저자님께 진심으로 감사합니다.
이 번역본들은 제가 공부용도로 번역기(papago, google transrate)를 돌려서
번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.
댓글로 지적해주시면 감사하겠습니다.
---------------------------------------------
Indexing Group By
ㄴhttps://use-the-index-luke.com/sql/sorting-grouping/indexed-group-by
SQL 데이터베이스는 알고리즘별로 완전히 다른 두 그룹을 사용합니다. 첫 번째인 해시 알고리즘은 입력 레코드를 임시 해시 테이블에 집계합니다. 모든 입력 레코드가 처리되면 해시 테이블이 결과로 반환됩니다.
두 번째 알고리즘인 정렬/그룹 알고리즘은 먼저 입력 데이터를 그룹화 키별로 정렬하여 각 그룹의 행이 즉시 연속적으로 서로 이어지도록 합니다. 나중에 데이터베이스는 이를 집계하기만 하면 됩니다.
일반적으로 두 알고리즘 모두 중간 상태를 구체화해야 하므로 파이프라인 방식으로 실행되지 않습니다. 그럼에도 불구하고 정렬/그룹 알고리즘은 인덱스를 사용하여 정렬 작업을 피할 수 있으므로 파이프라인 그룹을 활성화할 수 있습니다.
----------------------------------------------------------
Note
MySQL 8.0은 해시 알고리즘은 사용하지 않습니다.
그럼에도 불구하고 정렬/그룹 알고리즘에 대한 최적화는 아래 설명된 대로 작동합니다.
----------------------------------------------------------
다음 쿼리를 고려합니다.
PRODUCT_ID별로 그룹화된 어제의 매출을 제공합니다.
----------------------------------------------------------
SELECT product_id, sum(eur_value)
FROM sales
WHERE sale_date = TRUNC(sysdate) - INTERVAL '1' DAY
GROUP BY product_id
----------------------------------------------------------
이전 섹션의 SALE_DATE 및 PRODUCT_ID에 대한 인덱스를 알고 있으므로 INDEX RANGE SCAN이 필요한 순서로 행을 자동으로 전달하므로 정렬/그룹 알고리즘이 더 적합합니다. 즉, 명시적인 sort operation--the group by 가 파이프라인 방식으로 실행될 필요가 없기 때문에 데이터베이스가 구체화되지 않습니다.
----------------------------------------------------------
---------------------------------------------------------------
|Id |Operation | Name | Rows | Cost |
---------------------------------------------------------------
| 0 |SELECT STATEMENT | | 17 | 192 |
| 1 | SORT GROUP BY NOSORT | | 17 | 192 |
| 2 | TABLE ACCESS BY INDEX ROWID| SALES | 321 | 192 |
|*3 | INDEX RANGE SCAN | SALES_DT_PR | 321 | 3 |
---------------------------------------------------------------
----------------------------------------------------------
Oracle 데이터베이스의 실행 계획은 NOSTORT 부록을 사용하여 파이프라인 SORT GROUP by 연산을 표시합니다. 다른 데이터베이스의 실행 계획은 정렬 작업을 전혀 언급하지 않습니다.
파이프라인 group by는 ASC 및 DESC 수정자가 없다는 점을 제외하고 파이프라인 order by와 사전 요구 사항이 동일합니다. 즉, ASC/DESC 수정자를 사용하여 인덱스를 정의하면 실행 시 파이프라인 그룹에 영향을 주지 않습니다. NULLS FIRST/LAST도 마찬가지입니다. 그럼에도 불구하고 파이프라인 그룹에 대해 ASC/DESC 색인을 적절하게 사용할 수 없는 데이터베이스가 있습니다.
----------------------------------------------------------
Warning
인덱스가 NULL 값을 가능한 최소 값으로 처리하는 경우 PostgreSQL은 파이프라인 그룹을 자동으로 수행하지 않습니다. 인덱스 순서와 함께 절별 순서를 추가하면 이 문제가 해결됩니다.
Oracle 데이터베이스는 파이프라인 그룹 다음 순서를 실행하기 위해 인덱스를 뒤로 읽을 수 없습니다.
자세한 내용은 각 부록에서 확인할 수 있습니다.
----------------------------------------------------------
어제부터 모든 매출을 고려하도록 쿼리를 확장하면 파이프라인 주문에 대한 예에서 했던 것과 동일한 이유로 파이프라인 그룹을 차단합니다. INDEX RANGE SCAN은 그룹화 키로 주문한 행을 전달하지 않습니다.
(그림 6.1 비교).
----------------------------------------------------------
SELECT product_id, sum(eur_value)
FROM sales
WHERE sale_date >= TRUNC(sysdate) - INTERVAL '1' DAY
GROUP BY product_id
----------------------------------------------------------
----------------------------------------------------------
---------------------------------------------------------------
|Id |Operation | Name | Rows | Cost |
---------------------------------------------------------------
| 0 |SELECT STATEMENT | | 24 | 356 |
| 1 | HASH GROUP BY | | 24 | 356 |
| 2 | TABLE ACCESS BY INDEX ROWID| SALES | 596 | 355 |
|*3 | INDEX RANGE SCAN | SALES_DT_PR | 596 | 4 |
---------------------------------------------------------------
----------------------------------------------------------
대신 오라클 데이터베이스는 해시 알고리즘을 사용합니다. 해시 알고리즘의 장점은 집계된 결과만 버퍼링하면 되는 반면 정렬/그룹 알고리즘은 전체 입력 집합을 구체화한다는 것입니다. 즉, 해시 알고리즘은 더 적은 메모리를 필요로 합니다.
파이프라인 order by와 마찬가지로, 빠른 실행은 파이프라인 그룹에서 실행에 의한 가장 중요한 측면이 아닙니다. 전체 입력을 읽기 전에 데이터베이스가 파이프라인 방식으로 실행하고 첫 번째 결과를 전달하는 것이 더 중요합니다. 이는 다음 장에서 설명하는 고급 최적화 방법의 전제 조건입니다.
----------------------------------------------------------
Tip
정렬 및 그룹화 외에도 정렬을 피하기 위해 색인을 사용할 수 있는 다른 데이터베이스 작업을 생각할 수 있습니까?
----------------------------------------------------------
'use-the-index-luke' 카테고리의 다른 글
7.1 Selecting Top-N Rows (0) | 2023.11.03 |
---|---|
7장 Partial Results (1) | 2023.10.31 |
6.2 ASC/DESC and NULL FIRST/LAST (0) | 2023.10.27 |
6.1 Indexed Order By (0) | 2023.10.24 |
6장 Sorting and Grouping (1) | 2023.10.20 |