Skip to content

XML 쿼리에서 LIMIT OFFSET을 직접 지정할 수 있도록 지원#1959

Merged
1 commit merged into
xpressengine:developfrom
kijin:feature/query-offset
Jun 26, 2017
Merged

XML 쿼리에서 LIMIT OFFSET을 직접 지정할 수 있도록 지원#1959
1 commit merged into
xpressengine:developfrom
kijin:feature/query-offset

Conversation

@kijin

@kijin kijin commented Sep 12, 2016

Copy link
Copy Markdown
Contributor

LIMIT에 OFFSET을 사용하는 것은 SQL의 가장 기본적인 용법 중 하나인데, 현재 XE의 XML 쿼리 문법에서는 페이징 관련 변수들을 사용하여 간접적으로 OFFSET을 지정하는 방법밖에 없습니다.

예를 들어 아래와 같은 쿼리를 실행하려면

SELECT * FROM xe_documents ORDER BY list_order LIMIT 80, 20;

아래와 같이 페이징을 사용해야 합니다.

<navigation>
    <index var="sort_index" default="list_order" order="order_type" />
    <list_count var="list_count" default="20" />
    <page_count var="page_count" default="10" />
    <page var="page" default="1" />
</navigation>
$args = new stdClass;
$args->list_count = 20;
$args->page = 5;  // 80개 건너뛰려면 4페이지던가 5페이지던가? 아몰랑~
$output = executeQuery( ..... , $args);

게시판 모듈처럼 단순히 페이징을 하기 위한 목적이라면 이것만으로도 충분하지만, OFFSET을 직접 지정하고 싶을 때는 페이지 수를 일일이 계산해야 하기 때문에 상당히 불편합니다. 무한스크롤을 위한 AJAX 요청처럼 꼭 필요하지 않을 때도 PageHandler가 자동으로 호출되고 SELECT COUNT(*) 쿼리가 발생하여 성능에 상당히 큰 악영향을 미치고요. (게시판의 글 수가 수십만 개를 넘어가면 페이징을 위한 SELECT COUNT(*) 쿼리가 DB 부하의 대부분을 차지합니다.)

이 PR을 적용하면 <offset> 태그를 사용하여 OFFSET을 직접 지정할 수 있게 됩니다.

아래와 같이 쿼리를 작성하면 됩니다.

<navigation>
    <index var="sort_index" default="list_order" order="order_type" />
    <list_count var="list_count" default="20" />
    <offset var="offset" default="0" />
</navigation>
$args = new stdClass;
$args->list_count = 20;
$args->offset = 80;
$output = executeQuery( ..... , $args);

이 경우에는 PageHandler가 호출되지도 않고 SELECT COUNT(*) 쿼리가 발생하지도 않습니다. 정확하게 원하는 구간(80개 건너뛰고 그 다음 20개)의 데이터만 반환됩니다.

XML 쿼리 파서와 LIMIT 쿼리 생성 담당 클래스에 최소한의 기능만을 추가했으며, <offset> 태그를 사용하지 않는 기존 쿼리에는 어떤 영향도 주지 않습니다. <page> 태그와 <offset> 태그를 함께 쓰는 경우에는 <page> 태그가 우선순위를 가집니다.

@ghost ghost added the status/keep label Feb 1, 2017
@ghost ghost closed this Feb 1, 2017
@ghost ghost reopened this Feb 2, 2017
@ghost ghost self-assigned this Feb 2, 2017
@ghost ghost added this to the 1.8-2017-20W milestone May 15, 2017
@ghost ghost modified the milestones: 1.8-2017-26W, 1.8-2017-20W May 29, 2017
@ghost ghost merged commit c9ce464 into xpressengine:develop Jun 26, 2017
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant