달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

아... 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|작성자 라붐

Posted by tornado
|