본문 바로가기

use-the-index-luke

7.1 Selecting Top-N Rows

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