페이징을 구현햇습니다 테이블에 데이타는 약20만개가 있습니다
Select * From
(
Select ROW_NUMBER() OVER ( order By RegDate Desc ) AS RowNum ,
PK_ID , name, age From TestTable
Where MainID = 'test' ) as X
Where RowNum BETWEEN 1 AND 50
위와 같이 하면 1초도 안걸립니다
그런데 아래와 같이 하면 3초가 넘게 걸립니다
Select * From
(
Select ROW_NUMBER() OVER ( order By RegDate Desc ) AS RowNum ,
PK_ID , name, age From TestTable
Where MainID = 'test' ) as X
Where RowNum BETWEEN 208481 AND 208520
Comment 9
-
이리
2018.01.25 09:17
-
항해자™
2018.01.25 12:57
위와같이 쿼리하면 20만개를 모두 numbering 및 데이터를 다 읽게 됩니다~ -
문상연
2018.01.25 17:37
속도 개선 방법은 없을까여?
-
항해자™
2018.01.25 19:27
잇습니다,, 최종 읽은 지점 이후부터 읽게 하세요~ -
항해자™
2018.01.25 19:35
위 쿼리에 보니 pk_id가 잇는데~ 이게 유니크하다면, order by RegDate desc, pk_id로 정렬하시고~
인자값으로 마지막 위치의 RegDate desc, pk_id를 받아서 조건에 포함시키면 됩니다~
예를들면 아래와 같이,,,
where RegDate <= @pRegDate and pk_id > @pPkId -
항해자™
2018.01.29 12:46
http://m.book.naver.com/bookdb/book_detail.nhn?biblio.bid=8314807
1챕터 참고하세요~ -
항해자™
2018.01.25 19:50
아, 조건을 저렇게만 주면 안되겟네요~
데이터가 어떻게 들어가 잇는지 모르겟지만, 위 조건을 괄호로 묶고, or RegDate < @pRegDate 추가 -
항해자™
2018.01.25 20:45
and ( ( RegDate <= @pRegDate and pk_id > @pPkId )
or RegDate < @pRegDate)
이렇게 하면 될듯 하네요~
반대로 움직일 때는 조건이 바뀌겟네요~ -
문상연
2018.01.26 08:42
읽ㄴ은 시점의라는게 조회범위를 말씀하시는건가요?
ROwNUM,이
1~10 , 11~20 이런걸 말씀하시는건가요?
읽은시점의 의미를 모르겟습니다
그리고 프로시저에서 PK_ID를 넘겨받고 다시 넘겨줘야하나요?
죄송하지만 다시한번만 자세히 설명좀 부탁드리겠습니다
위 쿼리와 아래쿼리의 실행계획 혹은 프로파일을 보시면 아마 read수 차이가 많이 날거 같네요
또 index seek를 하는지 scan을 하는지도 확인해보세요