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)를 돌려서
번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.
댓글로 지적해주시면 감사하겠습니다.
---------------------------------------------
Querying Top-N Rows
ㄴhttps://use-the-index-luke.com/sql/partial-results/top-n-queries
상위 N개 쿼리는 결과를 특정 행 수로 제한하는 쿼리입니다. 이러한 항목은 결과 집합의 가장 최근 항목 또는 "최상의" 항목에 대한 쿼리인 경우가 많습니다. 효율적인 실행을 위해, 랭킹은 파이프라인 order by로 수행되어야 합니다
쿼리의 첫 번째 행만 가져오는 가장 간단한 방법은 필요한 행을 가져온 다음 문을 닫는 것입니다. 유감스럽게도 Optimizer는 실행 계획을 준비할 때 이를 예측할 수 없습니다. 최적의 실행 계획을 선택하려면 Optimizer는 응용프로그램이 궁극적으로 모든 행을 가져올지 여부를 알아햐 합니다. 이 경우 데이터베이스가 각 행을 개별적으로 가져와야 하는 경우에도 파이프 라인 order by가 10개 행만 가져올 때 더 낫지만 명시적 정렬 작업을 사용한 전체 테이블 검색이 가장 잘 수행될 수 있습니다. 즉, Optimizer는 최적의 실행 계획을 선택할 수 있도록 모든 행을 가져오기 전에 문을 중단할지 여부를 알아야합니다.
----------------------------------------------------------
Tip
모든 행이 필요하지 않을 때마다 데이터베이스에 알립니다.
----------------------------------------------------------
SQL 표준에서는 오랫동안 이 요구사항을 제외 했습니다. 해당 확장(먼저 가져오기)은 마침내 SQL:2008과 함께 도입되었으며 현재 IBM DB2, Postgre SQL, SQL Server 2012 , Oracle 12c 에서 사용할 수 있습니다. 한편으로는 이 기능이 비핵심 확장 기능이기 때문이고, 다른 한편으로는 각 데이터베이스가 수년 동안 독자적인 솔루션을 제공해 왔기 때문입니다.
다음 예제에서는 최근 판매 10건을 쿼리하여 이러한 잘 알려진 확장 기능을 사용하는 방법을 잘 보여 줍니다. 기본은 항상 동일합니다. 가장 최근의 판매 부터 시작하여
모든 판매를 가져옵니다. 각각의 top-N 구문은 열 개의 행을 가져온 후 실행을 중단합니다.
----------------------------------------------------------
Oracle
Oracle 데이터베이스에는 릴리스 12c 에서 fetch first 확장이 도입되었습니다. 이전 릴리스에서는 결과 집합의 행 번호를 자동으로 매기는 유사 열 ROWNUM을 사용해야합니다. 필터에서 이 열을 사용하려면 쿼리를 래핑해야 합니다.
SELECT *
FROM (
SELECT *
FROM sales
ORDER BY sale_date DESC
)
WHERE rownum <= 10
select
ename
from
emp
order by ename
fetch first 5 rows only;
추가설명 : https://www.dba-oracle.com/t_offset_fet_first_rows_only.htm
----------------------------------------------------------
위에 표시된 모든 SQL 쿼리는 데이터베이스가 상위 N 개의 쿼리로 인식하므로 특별합니다.
----------------------------------------------------------
Important
데이터베이스는 처음부터 이를 알고 있는 경우에만 부분 결과에 대한 쿼리를 최적화할 수 있습니다.
----------------------------------------------------------
optimizer가 열 개의 행만 필요하다는 사실을 알고 있다면, 해당되는 경우 파이프라인 order by를 사용하는 것이 좋습니다:
----------------------------------------------------------
Oracle
-------------------------------------------------------------
| Operation | Name | Rows | Cost |
-------------------------------------------------------------
| SELECT STATEMENT | | 10 | 9 |
| COUNT STOPKEY | | | |
| VIEW | | 10 | 9 |
| TABLE ACCESS BY INDEX ROWID| SALES | 1004K| 9 |
| INDEX FULL SCAN DESCENDING| SALES_DT_PR | 10 | 3 |
-------------------------------------------------------------
----------------------------------------------------------
Oracle 실행 계획은 COUNT STOPKEY 작업으로 계획된 종료를 나타냅니다. 이것은 데이터베이스가 상위 N 구문을 인식했다는 것을 의미합니다.
----------------------------------------------------------
Tip
부록 A의 "실행 계획"에는 DB2, MySQL, Oracle, PostgreSQL 및 SQL Server에 대한 해당 작업이 요약되어 있습니다.
----------------------------------------------------------
----------------------------------------------------------
Important
파이프라인 상위 N 쿼리는 전체 결과 집합을 읽고 정렬할 필요가 없습니다.
----------------------------------------------------------
SALE_DATE에 파이프라인 순서에 적합한 인덱스가 없는 경우 데이터베이스는 전체 테이블을 읽고 정렬해야 합니다. 첫 번째 행은 테이블에서 마지막 행을 읽은 후에만 전달됩니다.
----------------------------------------------------------
--------------------------------------------------
| Operation | Name | Rows | Cost |
--------------------------------------------------
| SELECT STATEMENT | | 10 | 59558 |
| COUNT STOPKEY | | | |
| VIEW | | 1004K| 59558 |
| SORT ORDER BY STOPKEY| | 1004K| 59558 |
| TABLE ACCESS FULL | SALES | 1004K| 9246 |
--------------------------------------------------
----------------------------------------------------------
이 실행 계획에는 파이프라인 순서가 없으며 클라이언트 측에서 실행을 중단하는 것만큼 느립니다. 데이터베이스는 전체 결과를 구체화할 필요가 없고 가장 최근의 10개 행만 구현할 필요가 있기 때문에 top-N 구문을 사용하는 것이 더 좋습니다. 이렇게 하면 메모리가 상당히 적게 필요합니다. Oracle 실행 계획은 SORT ORDER BY 작업에 STOPKEY 수식어를 사용하여 이 최적화를 나타냅니다.
Figure 7.1 Scalability of Top-N Queries
----------------------------------------------------------
----------------------------------------------------------
파이프라인 top-N 쿼리의 응답 시간은 테이블 크기에 따라 달라지지않지만 선택한 행수에 따라 계속증가합니다. 따라서 두배의 행을 선택하면 응답 시간이 두 배가 됩니다. 이는 추가 결과를 로드하는 "페이징" 쿼리의 경우 특히 중요합니다. 이 쿼리는 종종 첫 번째 항목에서 다시 시작하기 때문입니다. 이 쿼리는 이전 페이지에 이미 표시된 행을 읽고 두 번째 페이지의 결과에 도달하기 전에 이 행을 삭제합니다.
그럼에도 불구하고 이문제에 대한 해결책은 다음 섹션에서 확인할 수 있습니다.
----------------------------------------------------------
Links
Article “Finding the Best Match With a Top-N Query”
----------------------------------------------------------
'use-the-index-luke' 카테고리의 다른 글
7.3 Window-Functions (0) | 2023.11.10 |
---|---|
7.2 Fetching The Next Page (0) | 2023.11.07 |
7장 Partial Results (1) | 2023.10.31 |
6.3 Index-Oraganized Table (1) | 2023.10.31 |
6.2 ASC/DESC and NULL FIRST/LAST (0) | 2023.10.27 |