안녕하세요. 비입니다. ^^
세번째 강좌(?)를 올립니다.
시간 있을 때 다 올려놓는게 낫다고 판단이 되는군요. ^^;
URL : http://rainn.pe.kr
------------------------------------------------------------------
지난 시간에는 게시판 테이블에 레코드가 삽입되는 로직에 대해서 알아 보았습니다.
이번 시간에는 list 페이지에 필요한 asp 코드들을 대략 살펴보겠습니다.
---------------------------------------------------------------------
지난 강좌를 보셔서 아시겠지만 현재 테이블은 ref의 역순이 그 글이 보여지는 순서가 됩니다.
페이징은 간단하게 처리할 수 있겠습니다.
우리가 원하는 글의 ref 만을 불러오면 되는 거죠!
(사실 이 방법을 쓰기 전까지
select top * ... 과 rs.move 를 이용한 게시판이 그나마 젤 나은 성능을 보였습니다.)
원하는 글의 ref 불러오는 방법은..
SELECT [컬럼1], [컬럼2], .... FROM [테이블] ref BETWEEN [가장아래에보여줄글번호의ref] AND [가장위에보여줄글번호의ref]
ORDER BY ref DESC
가 되겠습니다.
간단하지 않습니까?
"ORDER BY ref DESC"에 의한 속도 저하는 없다고 보시면 됩니다.
제가 알기로는 ref에 걸린 index로 인해 쿼리최적화기기가 무시하게 되는듯 합니다.
(즉 ORDER BY 이하를 생략하더라도 글 순서는 변하지 않습니다. index를 DESC로 만들어준 이유가 거기에 있는거죠..)
이 방법으로 인해 우리는 페이지 값에 상관없이 언제나 동일한 페이징 속도를 낼 수가 있게 되는 거심니다!
그럼 우리가 해야 할 일은
시작ref와 끝ref 만 구해주면 되겠습니다.
자, 답은 다음과 같습니다.
start_num = record_count - (page - 1) * record_size
end_num = start_num - record_size + 1
start_num : 시작번호
end_num : 끝번호
record_count : 레코드 수이면서 가장 최상위글의 ref 입니다.
record_size : 한 페이지에 보여줄 게시물의 수
page : 현재 페이지 번호
record_count 는 지난번에도 말씀드렸듯이
SELECT TOP 1 ref FROM t3
으로 구하시면 되겠지만, 중간에 레코드를 삭제하여 이빨이 빠져있으면 안됩니다.
그러면 최상위 ref = 레코드 수 라는 법칙이 깨져버리기 때문입니다.
굳이 레코드를 삭제하고 싶으시면 ref를 적절히 변경해 주셔야 하겠죠?
- 지우고자 하는 글의 ref를 기억한다음
- 일단 레코드를 지우고
- 지운 글의 ref 보다 큰 ref를 가지는 레코드들의 ref를 1씩 빼주시면 됩니다.
하지만 답변형 게시판에서의 삭제 로직은 레코드 삭제를 대부분 비추하는 형태이죠..
답변글의 부모글이 지워지는 경우 화면 구성이 이상하게 될 수도 있겠죠..
record_size 는 원하는 값으로 아무 값이나 주시면 되겠죠..
시작ref와 끝ref 를 다 구했으면
위에 설명한대로 원하는 레코드만 샤악~ 불러오면 됩니다!
sql = "SELECT seq, title, name, writeday, readnum, depth FROM t3 WHERE ref BETWEEN " & end_num & " AND " & start_num & " ORDER BY ref DESC"
rs.Open sql, dbcon, adOpenForwardOnly, adLockReadOnly, adCmdText
보다 나은 속도를 위해 CURSORTYPE, LOCKTYPE, OPTION을 명시해 주시면 되겠습니다.
주의할 점은 start_num 과 end_num 의 위치입니다.!! 꼭 순서에 주의해 주시기 바랍니다.
순서 바꾸고 제대로 안나온다고 저한테 돌던지지 마세요 ^^*
참고로 총 페이지 수(page_count)는
page_count = int(record_count / record_size)
if (page_count * record_size) <> record_count then page_count = page_count + 1
와 같이 구하시면 되겠습니다.
다음시간에는 write, reply 에 대해서 알아보겠습니다.
감사합니다.
===============================
이성근 (rainn@rainn.pe.kr)
Soongsil Univ. Computer Science '95
(주)산그림닷컴
===============================
세번째 강좌(?)를 올립니다.
시간 있을 때 다 올려놓는게 낫다고 판단이 되는군요. ^^;
URL : http://rainn.pe.kr
------------------------------------------------------------------
지난 시간에는 게시판 테이블에 레코드가 삽입되는 로직에 대해서 알아 보았습니다.
이번 시간에는 list 페이지에 필요한 asp 코드들을 대략 살펴보겠습니다.
---------------------------------------------------------------------
지난 강좌를 보셔서 아시겠지만 현재 테이블은 ref의 역순이 그 글이 보여지는 순서가 됩니다.
페이징은 간단하게 처리할 수 있겠습니다.
우리가 원하는 글의 ref 만을 불러오면 되는 거죠!
(사실 이 방법을 쓰기 전까지
select top * ... 과 rs.move 를 이용한 게시판이 그나마 젤 나은 성능을 보였습니다.)
원하는 글의 ref 불러오는 방법은..
SELECT [컬럼1], [컬럼2], .... FROM [테이블] ref BETWEEN [가장아래에보여줄글번호의ref] AND [가장위에보여줄글번호의ref]
ORDER BY ref DESC
가 되겠습니다.
간단하지 않습니까?
"ORDER BY ref DESC"에 의한 속도 저하는 없다고 보시면 됩니다.
제가 알기로는 ref에 걸린 index로 인해 쿼리최적화기기가 무시하게 되는듯 합니다.
(즉 ORDER BY 이하를 생략하더라도 글 순서는 변하지 않습니다. index를 DESC로 만들어준 이유가 거기에 있는거죠..)
이 방법으로 인해 우리는 페이지 값에 상관없이 언제나 동일한 페이징 속도를 낼 수가 있게 되는 거심니다!
그럼 우리가 해야 할 일은
시작ref와 끝ref 만 구해주면 되겠습니다.
자, 답은 다음과 같습니다.
start_num = record_count - (page - 1) * record_size
end_num = start_num - record_size + 1
start_num : 시작번호
end_num : 끝번호
record_count : 레코드 수이면서 가장 최상위글의 ref 입니다.
record_size : 한 페이지에 보여줄 게시물의 수
page : 현재 페이지 번호
record_count 는 지난번에도 말씀드렸듯이
SELECT TOP 1 ref FROM t3
으로 구하시면 되겠지만, 중간에 레코드를 삭제하여 이빨이 빠져있으면 안됩니다.
그러면 최상위 ref = 레코드 수 라는 법칙이 깨져버리기 때문입니다.
굳이 레코드를 삭제하고 싶으시면 ref를 적절히 변경해 주셔야 하겠죠?
- 지우고자 하는 글의 ref를 기억한다음
- 일단 레코드를 지우고
- 지운 글의 ref 보다 큰 ref를 가지는 레코드들의 ref를 1씩 빼주시면 됩니다.
하지만 답변형 게시판에서의 삭제 로직은 레코드 삭제를 대부분 비추하는 형태이죠..
답변글의 부모글이 지워지는 경우 화면 구성이 이상하게 될 수도 있겠죠..
record_size 는 원하는 값으로 아무 값이나 주시면 되겠죠..
시작ref와 끝ref 를 다 구했으면
위에 설명한대로 원하는 레코드만 샤악~ 불러오면 됩니다!
sql = "SELECT seq, title, name, writeday, readnum, depth FROM t3 WHERE ref BETWEEN " & end_num & " AND " & start_num & " ORDER BY ref DESC"
rs.Open sql, dbcon, adOpenForwardOnly, adLockReadOnly, adCmdText
보다 나은 속도를 위해 CURSORTYPE, LOCKTYPE, OPTION을 명시해 주시면 되겠습니다.
주의할 점은 start_num 과 end_num 의 위치입니다.!! 꼭 순서에 주의해 주시기 바랍니다.
순서 바꾸고 제대로 안나온다고 저한테 돌던지지 마세요 ^^*
참고로 총 페이지 수(page_count)는
page_count = int(record_count / record_size)
if (page_count * record_size) <> record_count then page_count = page_count + 1
와 같이 구하시면 되겠습니다.
다음시간에는 write, reply 에 대해서 알아보겠습니다.
감사합니다.
===============================
이성근 (rainn@rainn.pe.kr)
Soongsil Univ. Computer Science '95
(주)산그림닷컴
===============================
'DataBase' 카테고리의 다른 글
대용량 게시판 만들기 강좌 #2/4 (게시판 로직) (0) | 2005.12.18 |
---|---|
대용량 게시판 만들기 강좌 #4/4 (WRITE, REPLY) (0) | 2005.12.18 |
아직도 Static SQL을 모르나?-2 (0) | 2005.12.18 |
아직도 Static SQL을 모르나?-1 (0) | 2005.12.18 |
아직도 Static SQL을 모르나?-4 (0) | 2005.12.18 |