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 6777 게시물 읽기
No. 6777
게시물 공지사항(인덱스) 어떻게 하시나요?
작성자
cReAm(catz)
작성일
2013-12-16 11:36ⓒ
2013-12-16 11:37ⓜ
조회수
8,841

 게시판을 읽어올때 

항상 포함되어야할 공지사항 게시물 때문에 고민입니다. 

 

설마 공지사항이 10건이 넘겠냐 만은  이걸 인덱스 선두로 삼자니, 다른 조건이 좀 걸리고 ...

보통 어떻게 구성하나요? 

 

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

매 페이지마다 공지사항이 계속 나와야 한다면 notices라는 별도의 테이블을 만들면 어떨까요?

첫페이지에만 나온다면 index에 추가하셔도 무방하리라 생각됩니다.

이용자 이름으로 검색 등이 게시판에 기능으로 있다면 검색결과에 공지사항이 나오나요? 그렇다면 별도 테이블이 좋을거 같습니다만 검색결과에서는 나오지 않아도 된다면 그냥 인덱스에 넣으셔도 될 듯 싶구요.

등록일역순으로 정렬하기, 등록자 이름으로 정렬하기 등의 기능이 있을때 이때 항상 나와야 한다면 별도 테이블로 떼어 내는 게 좋을거 같구요...

 

등등 현업에서 요구되는 부분을 잘 반영할 수 있는 방법이 좋겠습니다.

우욱님이 2013-12-16 13:38에 작성한 댓글입니다. Edit

우욱님 좋은 말씀 고맙습니다.!

등록일 정렬 , 변경일 정렬이 , 등록순 (이건 또 뭐냐!!) 정렬 

이런것들이 있어서 아쥬아쥬우 피곤하네요 ㅜ,.ㅜ

 

cReAm(catz)님이 2013-12-16 14:51에 작성한 댓글입니다.

가만히 생각을 해보다 보니 바로 이럴때가 별도의 테이블을 만들어서 관리하기 보다는 WHERE를 이용한 index를 생성하는 게 맞겠구나... 싶은 생각이 들었어요

CREATE NONCLUSTERED INDEX idxName ON tableName ( colName, ... ) WHERE notice = 1;

과 같은 방법이라면 별도의 테이블을 만들고 어쩌고 할 필요가 없겠네요.

우욱님이 2013-12-17 05:13에 작성한 댓글입니다. Edit

 또 좋은 의견 주셔서 고맙습니다!

 

헌데 공지 Flag 가 있어서 공지 Flag 조건에 맞는거 먼저 나오고 

공지 아닌거 뒤로 쭉 따라오는 형태라 

해당 인덱스가 좀 감이안오네요.-0-

 

설명이 너무 적었다는걸 느낀것이 :;

 

TOP 15 

where 없거나 있어두  'Y' or 'N' 조건

order 공지여부,등록일자 ,IDX

이런 식입니다! 

IDX에만 클러스터드 되어있고요 

클러스터를 섵불리 못바꾸는게 또 수정일자에 맞춰 정렬하는것도 있고....

뭔 또 딴 날짜에 맞춰서 정렬하는게 있고.. 해서 4~5가지 되네요 정렬방식이;; 

 

cReAm(catz)님이 2013-12-18 13:20에 작성한 댓글입니다.
이 댓글은 2013-12-18 17:35에 마지막으로 수정되었습니다.

listing을 하려면 제목, 등록일시 등이 들어 갈거 같구요.

 
사실 2012면 where가 없으므로
 
CREATE NONCLUSTERED INDEX 공지사항을위한인덱스 ON 테이블이름 ( notice, regDT ) INCLUDE ( seq, 제목, 글쓴이 )
;
 
SELECT seq, notice, 제목, 글쓴이, regDT
FROM 테이블
ORDER BY notice DESC -- 1이 공지사항이고 0이 일반 글이라 했을때 혹시 ASC가 맞다면 위의 index 생성도 적당히 변경을...
, regDT DESC
OFFSET 페이당게시물수*(몇번째 페이지-1) ROWS
FETCH NEXT 페이지당게시물수 ROWS ONLY
;
 
정도로 단순하고 이뿌게 게임이 끝날꺼고, 설사 WHERE절이 들어간다해도 
 
WHERE notice = 1 OR ( 검색조건 )
 
만 추가하면 깔끔히 해결되는데, 고민을 하고 계신 것으로 보아 2012 이전 버전이라는 생각이 듭니다.
뭐 그래봤댔자 첫번째 페이지에만 공지사항이 나온다면 위와 같은 index에
 
SELECT *
FROM
(
SELECT TOP ( @페이지수 * @페이지당게시물수 - (@페이지수-1) * @페이지당게시물수  ) *
FROM
(
SELECT TOP ( @페이지수 * @페이지당게시물수 ) 컬럼들
FROM 테이블
ORDER BY notice DESC, regDT DESC
) AS kk
ORDER BY notice ASC, regDT ASC
) AS ll
ORDER BY notice DESC, regDT DESC
;
 
면 문제가 없을텐데요. 매 페이지마다 공지사항이 다 뿌려지는 경우라면 (사실 이런 경우는 드물거라고 생각이 듭니다만 언제나 요구사항은 시궁창일 수 있으므로...)
 
CREATE NONCLUSTERED INDEX 공지사항을위한등록순인덱스 ON 테이블이름 ( regDT ) INCLUDE (제목, 글쓴이 ) WHERE 공지사항여부='Y' 
;
CREATE NONCLUSTERED INDEX 등록순 ON 테이블이름( regDT ) INCLUDE( 제목, 글쓴이 ) WHERE 공지사항여부=N'
;
 
SELECT 제목, 글쓴이, 등록일시, 공지에요
FROM
(
SELECT 제목, 글쓴이, 등록일시, 'Y' AS 공지에요
FROM 테이블이름
WHERE 공지사항여부 = 'Y'
UNION -- 공지사항이 검색결과에 나올 것을 대비하여 UNION ALL이 아닌 UNION으로 처리
-- 아래의 select 문은 간단히 적긴 하지만 사실 페이지 개념을 넣어서 코딩되어야 하는...
SELECT 제목, 글쓴이, 등록일시, 'N' AS 공지에요 
FROM 테이블이름
WHERE 공지사항여부 = 'N'
)AS kk
ORDER BY 
공지사항여부 DESC -- 공지사항부터 보여주기 위해서 Y부터 나오게 DESC
, 그리고_적당한_정렬_기준
;
 
식으로 길어지겠죠. 전에 말씀드렸던 별도의 table을 가져가서 join과 union으로 매번 공지사항을 낑겨 넣는 방법보다 index가 where를 달고 공지사항만 따로 돌아갈 수 있다면 union은 피할 수 없더라도 테이블을 별도로 관리하는 등의 cost는 줄일 수 있겠구나... 라고 생각했었던 부분이었습니다. ㅋ
 
간만에 길게 썼네요.. -_-;;
우욱님이 2013-12-18 19:06에 작성한 댓글입니다.
이 댓글은 2013-12-18 19:20에 마지막으로 수정되었습니다. Edit

상세한 도움글  고맙습니다! 

 2008R2 버전인데

MS-SQL은 처음이라;; 고민하고 있을뿐이였습니다. 뭘 몰라요... 

index 생성시 include 라는걸 처음 봤내요. 

 

보고서 작성하느라 연구할 시간이 ㅜ.ㅜ 엉엉 

 

cReAm(catz)님이 2013-12-19 12:46에 작성한 댓글입니다.
이 댓글은 2013-12-19 13:45에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
67802005에서 2012로 업그레이드할때 [1]
김기만
2013-12-30
10279
6779Sql 2008 개체 탐색기 테이블 필터 [3]
구성주
2013-12-20
12139
6778MS-SQL 300만건 페이징 쿼리 튜닝점 [2]
프돌이
2013-12-19
12399
6777게시물 공지사항(인덱스) 어떻게 하시나요? [6]
cReAm
2013-12-16
8841
6776데이터의 부분만 update 가능한가요? [1]
김우성
2013-12-14
7967
6775열을 행으로 바꾸는 방법좀 알려주서요 [4]
이남현
2013-12-12
10899
6774select절 스칼라서브쿼리 반환되는 컬럼이 여러개일때 어떻게 하면 좋을까요?(다중컬럼) [3]
cReAm
2013-12-11
10610
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다