아... sybase 처음 써봄.
데이터가 겁나게 많아서 오더링 잘못 내리면 겁나 느리다 ㅠㅠ
페이지 분할해서 봐야 하는데 mssql 이나 오라클, mysql 처럼 쉽지는 않지만...
예전 MSSQL 2000 에서 rowcount 를 이용해서 페이지 분할 하는 방법 비슷하게
작업할 수 있다.
그러나~~ 테이블 설계가 좀 이상하면 속도.. 겁나느리다. 테이블 수정하고 인덱스점 어케 건들고 싶지만 내 영역도 아니고, 서로 밥먹고 살아야 하기 때문에 나는 오로지 세션빈만 개발할란다~~
--------------------------------------------------------------------------------
[급:질문]top , rownum과 같이 라인수 주는 방법있나요?
작성자 강선규 작성일 2005-01-31 11:41:22 조회수 735
안녕하세요^^
지금 사이베이스로 개발을 하고 있는데,
방대한 데이터를 처리하는데(약 100,000 정도 되는거 같네여...ㅡ.,ㅡ;),
100개의 데이터씩 볼수 있게 하는
top , rownum과 같이 라인수 주는 방법있나요?
부탁드립니다.
이 글에 대한 댓글이 총 3건 있습니다.
프리챌 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
장형운(좋은구름)님이 2005-02-01 09:45:31에 작성한 댓글입니다.
다음은 직접 구현하여 테스트한 예제입니다.
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 INT
WITH RECOMPILE
AS
-- 페이지 번호가 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 ASC
go
이제 테스트해 볼까요?
-- 10건씩 첫 페이지
exec proc_mytable_view 10, 1
-- 10건씩 2 페이지
exec proc_mytable_view 10, 2
장형운(좋은구름)님이 2005-02-01 10:01:39에 작성한 댓글입니다.
이 댓글은 2005-02-01 10:07:05에 마지막으로 수정되었습니다.
장형운님이 작성하신게...모범답안이 될것같네요..
sybase ase는 조회page가 뒤쪽(제일 먼저 입력된 자료)일수록
page가 많은게 문제죠....(게시판에서...)
oracle의 rownum의 기능이 아쉽죠...
12.5.3부터는 top fuction을 제공을 합니다....
그걸 활용해 보시는 것도.....(뭐 rowcount랑 별차이는 없는데요....그게 많이 익숙할실듯 해서...)
지연님이 2005-02-01 11:18:22에 작성한 댓글입니다. Edit X
[출처] oracle-sybase conversion: ROWNUM|작성자 라붐
'SQL' 카테고리의 다른 글
Sybase 실행계획 보기 (0) | 2008.08.07 |
---|---|
[sybase] Update 시 조인을 걸어서 사용하기. (1) | 2008.08.07 |
[펌] 유용한 MS-SQL 사이트.. (0) | 2005.12.20 |
[펌] 「MySQL 5.0」등장, 기업 사용자도 OK! (0) | 2005.10.27 |
[펌] 동적 SQL의 축복과 저주 (0) | 2005.10.13 |