database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6778 게시물 읽기
No. 6778
MS-SQL 300만건 페이징 쿼리 튜닝점
작성자
프돌이
작성일
2013-12-19 14:58
조회수
12,272

약300만건 가량 들어있는 테이블입니다.

프로시져로 짰는데 넘느리네요....기본조건으로 카테고리와 지역에 초기값을 줘서 범위를 좁혔는데도 프로필러돌리면 duration 이 대략2000~3000정도나옵니다.

인덱스는 addr,title에 cate1,cate2,cate3,cate4 인클루드로 준게 하나있고

ATTACH_FILE1,M_SEQ 에도 하나줬습니다.

어떻게 쿼리를 짜야 좀더빨라질까요?  쿼리분석기에서는 3초가량 걸리는데 웹에서는 4초~6초정도 걸리네요.

접속자가 많은 사이트에 리스트로 출력되는 거라...duration 이 500이내로는 나와야될텐데..고민입니다.

DBA고수님들 도와주세요~~~~

 

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
 
 SELECT @TOTALCNT = COUNT(1)
 FROM  dbo.TB_BOARD
 WHERE   CATE1=(CASE WHEN @CATE1 IS NULL THEN CATE1  ELSE  @CATE1 END )
   AND CATE2=(CASE WHEN @CATE2 IS NULL THEN CATE2  ELSE  @CATE2 END )
   AND CATE3=(CASE WHEN @CATE3 IS NULL THEN CATE3  ELSE  @CATE3 END )
   AND CATE4=(CASE WHEN @CATE4 IS NULL THEN CATE4  ELSE  @CATE4 END )
   AND ADDR like ''+@AREA+'%'
   AND TITLE like ''+@SVALUE+'%';
 
  
   
 WITH TEMP_TABLE AS
 (
  SELECT
   ROW_NUMBER() OVER(ORDER BY ATTACH_FILE1 DESC,M_SEQ DESC) AS RowNum,*
  FROM  dbo.TB_BOARD
  WHERE CATE1=(CASE WHEN @CATE1 IS NULL THEN CATE1  ELSE  @CATE1 END )
   AND CATE2=(CASE WHEN @CATE2 IS NULL THEN CATE2  ELSE  @CATE2 END )
   AND CATE3=(CASE WHEN @CATE3 IS NULL THEN CATE3  ELSE  @CATE3 END )
   AND CATE4=(CASE WHEN @CATE4 IS NULL THEN CATE4  ELSE  @CATE4 END )
   AND ADDR like ''+@AREA+'%'
   AND TITLE like ''+@SVALUE+'%'
 )
 
 
 
 SELECT A.*
  ,(SELECT COUNT(1) FROM TB_BOARD_CMT B WHERE B.M_SEQ=A.M_SEQ AND DEL_YN='N') AS CMTCNT
  ,(SELECT COUNT(1) FROM TB_BOARD_RECOM C WHERE C.M_SEQ=A.M_SEQ) AS RECOMCNT
 FROM TEMP_TABLE A
 WHERE  ROWNUM BETWEEN ( @CURPAGE * @MAXPAGE + 1 - @MAXPAGE )
  AND ( @CURPAGE * @MAXPAGE )

이 글에 대한 댓글이 총 2건 있습니다.

웬지 게시판 냄새가 후끈 나는데요... 300만건이나 데이터가 있으시다면 꽤나 대형사이트이신거 같은데요... ㅋ

 
뭐 어쨌든 select할때 cate1에서 cate4까지가 배타적으로 항상 1개만 값을 갖나요? 아니면 사용자가 선택하는 대로 선택되는 형태인가요?
cate1의 값의 범위는 2개 정도에 골고루 분포되어 있나요?(예: 남자, 여자) 아니면 cate1의 값의 범위는 2개 정도에 극단적으로 몰려있나요?(예: 대한민국 군인의 남자, 여자)
cate1의 값의 범위가 수십가지가 넘으면서 골고루 분포되어 있나요?(예: 축구, 수영, 독서, 음악감상, ... )
아니면 cate1 ~ cate4가 계층적인가요? cate1이 대분류, 중분류, 소분류, 세분류 식으로...
@AREA와 @SVALUE는 어느 정도 빈도로 유입이 되는지... 실제 data 분포는 어떻게 되는지... ADDR과 TITLE의 데이터 형식(data type)은 어떻게 되는지...
등등에 따라 index를 선택할 기준 등이 틀려지므로 index를 어떻게 만들지 혹은 SELECT에 힌트를 어떻게 줄지 등등 
좋은 index를 생성하는 것에 영향을 주는 요소가 너무나 많은데 질문에서는 이런 부분이 없으므로 걍 pass하구요.
 
검색 조건에 맞는 전체 게시물의 갯수를 가져오는 부분이 화면에 꼭 표기되어야 하는 부분이 아니라면 혹은 기획자를 위협해서 뺄 수 있다면 빼버리세요.
다만 페이지 계산을 위해서 즉, 다음 페이지가 있으면 클릭할 수 있게 페이지 번호를 표시하는 등의 목적이라면 select 할때 추가로 적절히 select를 해서 해결하세요.
 
cate도 배타적 1개만 들어오면 해당 프로시저에서 cate별로 4개로 쪼개는 방법이 좋습니다. 그런게 아니라면 쿼리에 OPTION(RECOMPILE)을 붙여서 항상 좋은 인덱스를 선택해서 돌아갈 수 있도록 하는 편이 좋습니다.
 
http://www.4guysfromrolla.com/webtech/042606-1.shtml 이런 방법을 통해서 row_number보다 빠르게 페이징할 수 있는지도 살펴보시구요.
 
코멘트 테이블이나 추천 테이블의 갯수도 미리 집계를 해두는 것도 고려를 해보세요.
 
그리고 쿼리만 딸랑 보고 튜닝이 가능한 高手님이 계시면 저도 소개 좀...
 
우욱님이 2013-12-20 09:50에 작성한 댓글입니다. Edit

 좋은 질문과 답변덕에 배워갑니다! 

 

cReAm(catz)님이 2013-12-23 11:29에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6781Select에 관하여 질문드려요.. [2]
초보
2014-01-03
7971
67802005에서 2012로 업그레이드할때 [1]
김기만
2013-12-30
10141
6779Sql 2008 개체 탐색기 테이블 필터 [3]
구성주
2013-12-20
12006
6778MS-SQL 300만건 페이징 쿼리 튜닝점 [2]
프돌이
2013-12-19
12272
6777게시물 공지사항(인덱스) 어떻게 하시나요? [6]
cReAm
2013-12-16
8749
6776데이터의 부분만 update 가능한가요? [1]
김우성
2013-12-14
7885
6775열을 행으로 바꾸는 방법좀 알려주서요 [4]
이남현
2013-12-12
10792
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.046초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다