본문 바로가기

use-the-index-luke

6.3 Index-Oraganized Table

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 데이터베이스는 파이프라인 그룹 다음 순서를 실행하기 위해 인덱스를 뒤로 읽을 없습니다.

 

자세한 내용은 부록에서 확인할 있습니다.

PostgreSQLOracle.

----------------------------------------------------------

 

어제부터 모든 매출을 고려하도록 쿼리를 확장하면 파이프라인 주문에 대한 예에서 했던 것과 동일한 이유로 파이프라인 그룹을 차단합니다. 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