안녕하세요^^
지금 사이베이스로 개발을 하고 있는데,
방대한 데이터를 처리하는데(약 100,000 정도 되는거 같네여...ㅡ.,ㅡ;),
100개의 데이터씩 볼수 있게 하는
top , rownum과 같이 라인수 주는 방법있나요?
부탁드립니다.
프리챌 DW개발자모임 커뮤니테에 있는 글을 올립니다. 도움이 되었으면 합니다.
[1] SET ROWCOUNT nn 사용하기
1> set rowcount 10 2> go 1> select foo 2> from bar 3> order by barID desc 4> go
그렇다면, 100번째부터 150번째까지를 가져오려면??
[2] 임시테이블을 사용한다면,
set rowcount 150 select rowid = identity(3), col1, col2 into #tempA from masterTable where clause... order by 2,3 처럼 rowid라는 칼럼을 identity(3)으로 생성하면 1번부터 번호가 부여된다.
그런 다음,
select * from #tmepAwhere rowid between 100 and 150
하면 된다.
사용한 temp 테이블은 세션이 끊기면 자동으로 제거되지만
drop table #tempA를 해주는것이 좋겠다.
[3] 150건을 먼저 temp에 넣고 100건을 삭제하는 건 어쩔까?
set rowcount 150 select col1, col2 into #tempA from masterTable where clause... set rowcount 100 delete #tempAselect * from #tempA [4] 임시 테이블을 사용하지 않고 처리하는 방법??테이블에 identity 칼럼을 만들어 놓고,다음과 같은 조회용 프로시저를 만들어보자.사용법?-- 레코드 100번부터 50건 조회한다면exec proc_my_view(50, 3) CREATE PROCEDURE proc_my_view @perpage INT, @pagenumber INT WITH RECOMPILE AS -- 페이지 번호가 1인 경우는 아주 쉽네요. set rowcount 사용하면 되니까 IF @pagenumber = 1 BEGIN SET ROWCOUNT @perpage SELECT ... RETURN END -- 페이지가 1보다 큰 경우에는 시작할 레코드 번호를 구해서 DECLARE @min_postid NUMERIC( 8, 0 ), @position INT SELECT @position = @perpage * ( @pagenumber - 1 ) + 1 SET ROWCOUNT @position -- 해당 레코드까지 이동해 가자. 물론, set rowcount를 이용해서 SELECT @min_postid = postid FROM post WHERE ... ORDER BY postid ASC SET ROWCOUNT @perpage -- we know where we want to go (say the 28th post in a set of 50). SELECT ... FROM post WHERE postid >= @min_postid ... ORDER BY postid ASC
set rowcount 150 select col1, col2 into #tempA from masterTable where clause... set rowcount 100 delete #tempA
select * from #tempA
[4] 임시 테이블을 사용하지 않고 처리하는 방법??
테이블에 identity 칼럼을 만들어 놓고,
다음과 같은 조회용 프로시저를 만들어보자.
사용법?
-- 레코드 100번부터 50건 조회한다면
exec proc_my_view(50, 3)
CREATE PROCEDURE proc_my_view @perpage INT, @pagenumber INT WITH RECOMPILE AS -- 페이지 번호가 1인 경우는 아주 쉽네요. set rowcount 사용하면 되니까 IF @pagenumber = 1 BEGIN SET ROWCOUNT @perpage SELECT ... RETURN END -- 페이지가 1보다 큰 경우에는 시작할 레코드 번호를 구해서 DECLARE @min_postid NUMERIC( 8, 0 ), @position INT SELECT @position = @perpage * ( @pagenumber - 1 ) + 1 SET ROWCOUNT @position -- 해당 레코드까지 이동해 가자. 물론, set rowcount를 이용해서 SELECT @min_postid = postid FROM post WHERE ... ORDER BY postid ASC SET ROWCOUNT @perpage -- we know where we want to go (say the 28th post in a set of 50). SELECT ... FROM post WHERE postid >= @min_postid ... ORDER BY postid ASC
다음은 직접 구현하여 테스트한 예제입니다.
MYTABLE 이라는 테이블이 있습니다.
create table MYTABLE
(
seqnum numeric(10,0) identity not null,
subject varchar(100) null,
context varchar(250) null,
writer char(10) null
)
이 테이블은 identity 속성에 의해 seqnum 컬럼에 데이터 입력시 자동으로 순번이 들어가겠지요.
다음은 proc_mytable_view라는 프로시저를 만들어서
게시판 조회할 때 호출합니다.
CREATE PROCEDURE proc_mytable_view @perpage INT, @pagenumber INTWITH RECOMPILEAS
-- 페이지 번호가 1인 경우는 아주 쉽네요. set rowcount 사용하면 되니까 IF @pagenumber = 1 BEGIN SET ROWCOUNT @perpage
SELECT * from MYTABLE order by seqnum RETURN END
-- 페이지가 1보다 큰 경우에는 시작할 레코드 번호를 구해서 DECLARE @min_seqnum NUMERIC(8, 0), @position INT
SELECT @position = @perpage * ( @pagenumber - 1 ) + 1
SET ROWCOUNT @position
-- 해당 레코드까지 이동해 가자. 물론, set rowcount를 이용해서 SELECT @min_seqnum = seqnum FROM MYTABLT ORDER BY seqnum ASC
SET ROWCOUNT @perpage
SELECT * FROM MYTABLE WHERE seqnum >= @min_seqnum ORDER BY seqnum ASCgo
이제 테스트해 볼까요?
-- 10건씩 첫 페이지
exec proc_mytable_view 10, 1
-- 10건씩 2 페이지
exec proc_mytable_view 10, 2
장형운님이 작성하신게...모범답안이 될것같네요..
sybase ase는 조회page가 뒤쪽(제일 먼저 입력된 자료)일수록
page가 많은게 문제죠....(게시판에서...)
oracle의 rownum의 기능이 아쉽죠...
12.5.3부터는 top fuction을 제공을 합니다....
그걸 활용해 보시는 것도.....(뭐 rowcount랑 별차이는 없는데요....그게 많이 익숙할실듯 해서...)