쿼리 성능 개선: No Offset을 활용한 페이지네이션

개요

대량의 데이터를 처리하는 애플리케이션에서 쿼리 성능을 개선하는 것이 중요하다고들 한다. 최근 프로젝트에서는 페이지네이션을 적용하여 성능을 최적화하기로 했다. 전통적인 페이지네이션 방식 대신 “No Offset” 기법을 사용하여 데이터베이스 쿼리의 성능을 향상시키고자 했다.

기존 페이지네이션 방식

기존 방식은 OFFSET과 LIMIT을 사용하는 페이지네이션 방법이었다. 데이터가 많은 경우, OFFSET을 증가시키면서 성능이 저하되는 문제가 있었다. 예를 들어, 다음과 같은 쿼리를 보자:

SELECT *
FROM data_table
ORDER BY id ASC
OFFSET #{offset} ROWS FETCH NEXT #{limit} ROWS ONLY;

이 쿼리는 페이지가 변경될 때마다 OFFSET을 증가시켜야 하며, 데이터가 많아질수록 성능이 저하된다. OFFSET을 사용하면 데이터베이스는 스캔해야 할 레코드 수가 많아져, 성능 문제가 발생한다.

No Offset 방식 적용

No Offset 기법은 데이터베이스에서 OFFSET을 사용하지 않고, 마지막으로 조회된 레코드의 ID를 기준으로 다음 레코드를 조회하는 방식이다. 이를 통해 쿼리 성능을 개선할 수 있다. 구현 방법은 다음과 같다:

SELECT *
FROM data_table
WHERE id > #{lastId}
ORDER BY id ASC
FETCH NEXT #{limit} ROWS ONLY;
  • #{lastId}: 이전 페이지에서 마지막으로 조회된 레코드의 ID.
  • #{limit}: 한 페이지에 표시할 레코드 수. 이 쿼리는 OFFSET을 사용하지 않으며, 인덱스를 효율적으로 활용하다. 데이터베이스는 id가 #{lastId}보다 큰 레코드만 조회하면 되므로 성능이 개선된다.

따라서 애플리케이션 단에서는 추가로 lastId를 전달하도록 구현했다.


© 2022. All rights reserved.

Powered by Hydejack v9.2.1