서브쿼리는 limit 없이 외부에서 잘라도 될까요? 0 9 2,165

by 란주 [SQL Query] [2023.01.31 11:59:56]



페이징 쿼리인데요..

limit 없으면 서브쿼 전체 조회결과를 외부에서 조건으로 

자르기? 하는게 아닌지요...

by 마농 [2023.01.31 13:11:18]

LIMIT 은 MySQL 구문입니다.
MSSQL 은 TOP
Oracle 은 ROWNUM 사용합니다.
각 DBMS 마다 구현방법이 다릅니다., 같은 DB라고 해도 각 버전마다 구현방법이 다릅니다.
공통적으로 사용 가능한 것은 ROW_NUMBER 분석함수입니다.
그런데 :: 이라는 구문을 보면 오라클은 아닌 듯 한데?
PostgreSQL 인가요? 포스그레에도 ROWNUM 이 있는지?
::NUMBER 부분만 빼면 오라클에서 ROWNUM 을 이용한 페이징 방법입니다.


by 란주 [2023.01.31 13:27:06]

네 postgre 맞습니다아..


by 란주 [2023.01.31 13:29:29]

질문 다시 드리면

박스안에 select문 limit 안해도 전혀 문제 없는건가요??


by 마농 [2023.01.31 13:39:12]

글쎄요? 포스그레에 ROWNUM 이 없을텐데???
오라클 기준으로는 문제 없는 구문이긴 합니다. 포스그레에서도 문제 없을런지는?
그리고, 페이징하는데 정렬이 없는게 이상하네요?


by 마농 [2023.01.31 13:52:44]
-- PostgreSQL 페이징 쿼리
SELECT *
  FROM t
 WHERE 조회조건
 ORDER BY 정렬기준
OFFSET 60
 LIMIT 10
;

 


by pajama [2023.01.31 13:58:34]

postgres에서도 limit 사용이 되네요. 그리고 rownum이 사용가능하시다면 edb 사용중이신가 봅니다.


by 란주 [2023.01.31 14:30:33]

edb 네 맞습니다.

근데 제가 진짜 쿼리 초보라 그러는데요

위 이미지 빨간박스 인라인뷰가 실행되면 전체스캔결과가 아닌가요?? 페이징 할때마다 전체스캔을 하는지...

소스코드 보다가 이해를 못해서요..

제가 서브쿼리 이해를 잘못하고 있는 걸까요??


by 마농 [2023.01.31 15:10:04]

인라인뷰를 실행한다고 해도, 인라인뷰 바깥쪽에 ROWNUM 조건을 주면
옵티마이저가 알아서 유리한 쪽으로 쿼리를 바꾸어 실행합니다.
인라인뷰를 해체하거나, ROWNUM 조건을 인라인뷰 안쪽으로 집어넣거나
무조건 그렇게 하는건 아니고, 가능한 경우에 한해서 그렇게 합니다.

위 쿼리의 경우에는 특별한 가공도 없고 정렬도 없으니 인라인뷰가 해체됩니다.(뷰머징)
그룹바이와 같이 가공이 된 쿼리는 뷰머징이 안되고, 조건절 삽입이 가능한지를 따져보게 됩니다.
정렬 쿼리는 정렬 없이 인덱스스캔만으로 대체가 가능한지를 따져보게 됩니다.
인덱스 스캔이 가능하면 원하는 만큼만 읽고 끝낼 것이고
인덱스 스캔이 불가능하면 전체 다 읽어서 정렬해야 합니다.(어쩔 수 없음)
다만 페이징 쿼리의 경우 정렬 공간을 덜 사용합니다.
정렬용 공간을 전체 데이터에 해당하는 만큼 사용하는게 아니라
70 행 만큼의 공간만 사용합니다. 공간을 덜 쓰게 되는 것이죠.


by 란주 [2023.01.31 15:20:43]

마농님 답변 영광입니다.

감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입