본문 바로가기
Project

Personal 1-2) (Oracle) 페이징 이해 - 원하는 데이터 최적화하여 가져오기

by code_learner 2022. 4. 15.

- 페이징에서 DB로 가져와야 할 값은 2가지이다.

1. 페이징 처리해야 할 전체 데이터(row의 수)

2. 화면에 보여줘야 할 데이터의 List

 

- 페이징 할 테이블이다.

CREATE TABLE COFFEE(
	CID INT PRIMARY KEY,
	CNAME VARCHAR(300) NOT NULL,
	CCOUNTRY VARCHAR(100) NOT NULL,
	CNUM INT DEFAULT 0,
	CPRICE INT NOT NULL,
	CCONTENT VARCHAR(300),
	CPIC VARCHAR(500)
);

 


[페이징 처리해야 할 전체 데이터(row의 수)]

 

private final String COFFEELIST_CNT = "SELECT COUNT(*) AS LISTCNT FROM COFFEE";

여기에 검색 기능이 들어가게 되면 sql문 뒤에 조건을 달면 된다.

ex) 이름 검색 : COFFEELIST_CNT+" WHERE CNAME LIKE '%'||?||'%'";

 


[화면에 보여줘야 할 데이터의 List]

ex) 예시

- Coffee테이블의 1~5번 데이터를 가져와야 한다.

: Row Number를 사용해야 한다.

 

*Row Number란?

출력되는 결과물에 순차적인 번호를 달아주는 기능.

출력되어야 할 순서대로 정렬한 뒤 가상의 번호인 Row Number를 달아주어 원하는 영역의 자료만 가져올 수 있는 방식을 취한다. 

but, 시스템에 부하를 주어 많은 게시물을 가지고 있는 경우 특정 영역의 게시물들을 가져오는데 그 반응이 느려진다.

 

1. 페이지에 번호 붙이기

SELECT ROWNUM AS RNUM, CNAME, CPRICE FROM COFFEE ORDER BY CPRICE;

가격순으로 정렬했으나 RNUM은 그에 맞춰 순서대로 출력이 되지 않는다. 이는 SQL 쿼리의 실행 순 때문이다.

 

-SQL 쿼리 순서-

[ FROM - WHERE -GROUP BY -HAVING- SELECT -ORDER BY ] 

Row Number은 SELECT 다음에, ORDER BY 전에 할당된다.

따라서 정렬을 한 후(서브 쿼리)에 번호를 부여하는 방식을 사용한다.

SELECT ROWNUM AS RNUM, A.* FROM 
		(SELECT CNAME, CPRICE FROM COFFEE ORDER BY CPRICE DESC) A;

 

 

2. 원하는 만큼의 데이터 가져오기

숫자 범위를 이용해 값을 가져오는 방법: BETWEEN - AND -

SELECT ROWNUM AS RNUM, A.* FROM 
		(SELECT CNAME, CPRICE FROM COFFEE ORDER BY CPRICE DESC) A
		 WHERE ROWNUM BETWEEN 1 AND 5;

쉽게 가져올 수 있지만 이러한 방법은 모든 데이터에 ROWNUM을 부여한 후, 그 데이터에서 숫자의 범위를 가져오는 방식으로 시스템에 부하를 주어 수많은 데이터가 있다면 속도가 눈에 띄게 저하되는 모습을 볼 수 있다. 때문에 서브 쿼리를 한번 더 사용해 최적화를 해준다.

SELECT * FROM 
	(SELECT ROWNUM RNUM, A.*FROM
	(SELECT CNAME, CPRICE FROM COFFEE ORDER BY CPRICE DESC)
			 A WHERE ROWNUM<=5)X WHERE X.RNUM >=1;

같은 결괏값이지만 이러한 방법은 ROWNUM을 부여하다 5번째 이후 데이터는 버린다. 이후 5개 안에서 앞에서부터 데이터를 가져오기 때문에 속도 차이가 발생한다.

 

 

3. 조건 걸어주기(검색)

SELECT * FROM 
	(SELECT A.*, ROWNUM RNUM FROM
	(SELECT CNAME, CPRICE FROM COFFEE 
    	WHERE CNAME LIKE '%에%' ORDER BY CPRICE DESC)
			 A WHERE ROWNUM<=5)X WHERE X.RNUM >=1;

 

 

*소감:

SQL 쿼리의 실행 순서는 출력하는 내용에 큰 차이를 보여준다면, 최적화는 같은 내용을 출력해 주더라도 속도 향상에 큰 차이를 보여 사용자 편의성을 높여줄 수 있다는 점에서 매우 매력적으로 느껴졌다.

 

 

 

 

 

-참고사이트-

https://okky.kr/article/282926

 

OKKY | 페이징(Paging)에 대한 이해 - (2) ROW NUMBER 을 이용한 게시물 가져오기.

흔히 웹 개발을 처음 하는 개발자가 처음 겪게 되는 난관은 바로 게시판의 페이징(Paging)이 아닐까 합니다. 특히 DBMS 와 연동해서 개발하는 경우가 많은데, 각 DBMS 마다 페이징 방법도 많고 성능

okky.kr

 

댓글