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 |