본문 바로가기

use-the-index-luke

7.3 Window-Functions

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)를 돌려서 

번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.

댓글로 지적해주시면 감사하겠습니다.

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

 

Using Window Functions for Efficient Pagination

https://use-the-index-luke.com/sql/partial-results/window-functions

 

Window function SQL에서 페이지화를 구현하는 다른 방법을 제공합니다. 이는 무엇보다 유연하고 표준을 준수하는 방법입니다.

그러나 SQL Server, Oracle database PostgreSQL 15+ 파이프 라인 top-N 쿼리에 사용할 있습니다. MySQL, MariaDB0 DB2(LUW) 충분한 행을 가져온 인덱스 검색을 중단하지 않으므로 이러한 쿼리를 매우 비효율적으로 실행합니다.

 

 

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

SELECT *
  FROM ( SELECT sales.*
              ,
ROW_NUMBER() OVER (ORDER BY sale_date DESC
                                          , sale_id   DESC) rn

           FROM sales
       ) tmp
 
WHERE rn between 11 and 20
 ORDER BY sale_date DESC, sale_id DESC

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

 

ROW_NUMBER 함수는 over 절에 정의된 정렬 순서에 따라 행을 열거합니다. 외부 where 절은 열거행을 사용하여 결과를 번째 페이지(11~20)으로 제한합니다.

 

Oracle 데이터베이스는 중단 조건을 인식하고 SALE_DATE SALE_ID 인덱스를 사용하여 파이프라인 상위 N 동작을 생성합니다:

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

---------------------------------------------------------------
|Id | Operation                      | Name    | Rows |  Cost |
---------------------------------------------------------------
| 0 | SELECT STATEMENT               |         | 1004K| 36877 |
|*1 |  VIEW                          |         | 1004K| 36877 |
|*2 |   WINDOW NOSORT STOPKEY        |         | 1004K| 36877 |
| 3 |    TABLE ACCESS BY INDEX ROWID | SALES   | 1004K| 36877 |
| 4 |     INDEX FULL SCAN DESCENDING | SL_DTID | 1004K|  2955 |
---------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN">=11 AND "RN"<=20)
2 - filter(ROW_NUMBER() OVER (
           ORDER BY "SALE_DATE" DESC, "SALE_ID" DESC )<=20)

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

WINDOW NOSORT STOPKEY 작업은 정렬 작업(NOSORT) 없으며 상한 입계값(STOPKEY) 도달하면 데이터베이스가 실행을 중단함을 나타냅니다. 중단된 작업이 파이프라인 방식으로 실행된다는 점을 고려하면 쿼리는 이전 섹션에서 설명한 오프셋 방법만큼 효율적입니다.

 

어러한 최적화를 지원하는 것은 SQL 제품에서 결코 일반적이지 않습니다.

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

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

최적화는 개념적으로 모든 단조 함수에서 작동할 있지만, 분석된 구현 ROW_NUMBER 함수에 초점이 맞춰져 있습니다.

 

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

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

파티션 사용 주의해야 사항: where 절이 행을

단일 파티션으로 제한하더라도 파티션의 순수한 존재는 일부 제품에서 최적화를 비활성화합니다. 분할된 기능이 보기의 일부이지만 외부 쿼리는 보기를 단일 파티션으로 제한하는 경우 문제가 발생할 있습니다.

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

 

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

그러나 Window Function 강점은 페이지화가 아니라 분석적 계산입니다. 기능을 사용해 본적이 없는 경우에는 해당 설명서를 검토하는 시간을 항애해야 합니다.

'use-the-index-luke' 카테고리의 다른 글

8.1 Insert  (1) 2023.11.14
8장 Insert, Delete and Update  (0) 2023.11.10
7.2 Fetching The Next Page  (0) 2023.11.07
7.1 Selecting Top-N Rows  (0) 2023.11.03
7장 Partial Results  (1) 2023.10.31