하늘높이의 프로그래밍 이야기

윈도우 2008에는 2003과 다르게 기본적으로 미디어 서비스가 설치되어 있지 않습니다.

그래서 별도로 설치를 해야 하네요. 설치하는 방법을

한글 버전의 다운로드는 아래의 링크를 클릭하여 다운 받아 주십시오.

 

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=9ccf6312-723b-4577-be58-7caab2e1c5b7

 

image

 

이 중에서 서버의 CPU에 맞는 Server.msu (통합본)를 설치해 주십시오.

* 2008 Core설치에서는 Core 본을 설치해 주십시오~

 

그리고 설치 후 역활 추가 마법사를 실행시켜 역할 추가

 

image

미디어 서비스 선택

 

image

서비스 소개

 

image

설치할 역할 서비스 선택 

image

프로토콜 선택

MMS가 빠져 있는 것을 보니 Media Player 11 처럼 MMS 프로토콜이 아예 빠진 것 같네요.

image

설치!!

image

설치 완료

image

 

회사에 프로젝트 때문에 리눅스 서버를 한대 설치하던 중

페도라가 벌써 10 버전이나 되었더라.

(8버전 사용중)

 

음 그래서 집에 테스트 서버를 업그레이드 해보기로 했다.

그리고 역시 yum을 이용하면 간단해^^

 

# wget ftp://download.fedora.redhat.com/pub/fedora/linux/releases/10/Fedora/x86_64/os/Packages/fedora-release-10-1.noarch.rpm
# wget ftp://download.fedora.redhat.com/pub/fedora/linux/releases/10/Fedora/x86_64/os/Packages/fedora-release-notes-10.0.0-1.noarch.rpm
# rpm -Uvh fedora-release-10-1.noarch.rpm fedora-release-notes-10.0.0-1.noarch.rpm
# yum clean all
# yum upgrade

하면 바로 업그레이드 시작!! 중간 중간에 디펜던시 에러나는 패키지들을 일단 과감하게 삭제… 물론 운영 중인 서비스와 관계 된다면 대략 난감이겠지만.

집에 PC 테스트하는 개인 PC이므로!! 고고씽!!

 

그리고 2기가 다운로드 와 업데이트!! 반나절 정도 걸리는걸

image

업그레이드 끝!!

블로그 코리아에서 리뷰하는 도너스캠프 기부 체험 리뷰에 저도 참여했습니다.

image

image

뭔가 1000원 이라는 것이 조금 미안하네요.

그래도 기부라는 작은 씨앗을 심는 것 같아서 기분은 좋습니다.

 

“여러분도 함께 참여해 보세요.!!”

image

여러분이 많이 방문해 주셔서 클릭 해 주신 올 블로그 광고와

푸푸양과 승원군 그리고 썬컴군이

도움 준 해피빈 콩을 이용해 사랑의 연탄 나눔 운동에 후원하였습니다.

 

참고: 사랑의연탄나눔운동 후원금(2008)

http://happylog.naver.com/lovecoal/H000000010631

하늘높이의 콩 저금통

http://fund.happybean.naver.com/56082

 

방문 많이 해주시고 광고 클릭해 주셔서 감사합니다.!~

앞으로도 많은 방문 부탁 드려요!~

오늘 아침에 각종 포탈에 뜬 “성룡의 4천억 전 재상 사회 환원” 기사를 보았다.

 

그리고 그가 생각하고 있는 자녀 교육관에 감동 받을 수 밖에 없었다.

“아들에게 능력이 있으면 아버지의 돈이 필요하지 않을 것이다. 능력이 없다면 더 더욱 아버지가 모은 재산을 아들이 헛되이 탕진하게 할 수 없다.”

멋있다. 정말 멋있다.

 

나도 몇 년 전부터 만약 내가 언젠가 죽는다면 이라는 생각을 많이 해보게 되는데…

과연 나라면 저렇게 나의 모든 재산을 사회에 환원하고 갈 수 있을까?

내 평생을 걸어 모은 돈을 … 사회에 환원?

이라는 생각도 해보게 되었다.

그러나 역시 쉽지는 않을 것 같다.

 

워렌버핏 처럼… 빌게이츠 처럼 그리고 성룡처럼…

저렇게 아름답게 세상을 떠날 수 있을까?

 

어쨌든 자식에게 회사를 물려 주려고 혈안이 되어 있는 특정 부자들,

궁지에 몰려서 어쩔 수 없이 기부를 행동,

기부한다고 해 놓고 회사 광고만 하는 기부 행동이 아닌 개인의 가치관이 담긴 기부…

 

아름다운 행동인 것 같아서 기분이 좋다.

 

성룡 화이팅!!

IT 회사 이건 기타 다른 분야의 회사이건

사람이 모여서 하는 일이기에…

사람을 쓰고 배치하는 것은 관리자의 중요한 역할이다.

 

뭐 예를 들자면 베토벤 바이러스 같은 드라마를 봐도 이 악기 저 악기 들의 적절한 조합과

지휘를 통해 하나의 멋진 음악이 만들어 진다.

 

그렇다면 정말 능력 있는 지휘, 관리자가 되기 위해서는

개인의 특성과 능력 등의 장단점을 정확히 볼 수 있어야 한다 것인데…

이런 능력들은 어떻게 키워야 할까?

 

어떻게 사람들의 장단점을 정확히 볼 수 있을까?

어떻게 최상의 포지션으로 사람들을 배치 할 수 있을까?

 

손자병법 이런 말이 나온다고 한다.

識衆寡之用者勝 – 적은 부대 라도 특성을 알고 맞게 지휘 할 줄 아는 장수는 이긴다.

(識 알 식, 衆 무리 중, 寡 적을 과, 之 갈 지 , 用 쓸 용, 者 사람 자 , 勝 이길 승)

 

힘든 시기, 이런 능력은 어떻게 키울 수 있을지 고민해 봐야겠다.

SQL Injection 처리 이 글을 작성한 지 한 일주일 정도가 흘렀는데…

블로그에 이 키워드로 방문하시는 분이 꽤 많으신 듯…

 

해당 키워드를 다시 찾아보니…

구글에 찾아보니 검색된 사이트가 28300여 개로 늘었다. (허걱 4배나…)

 

구글 검색

 

음 “빵빵용용”님의 새 글(http://saybox.tistory.com/546 )을 읽어 보면 이 공격의 원인도 보이고 해결 방법도 보인다.

 

하지만…

Request 를 받는 모든 소스를 수정한다는 것은…만만한 작업은 아니더라...

지금 사이트도 Request를 검색해보니 4~500개

하지만 이 사이트는 1년에 글 한 개 올라오기 힘든 회사 소개 홈페이지 인데…

그것을 위해 게시판 소스를 다 뒤집자니 시간이 아깝고… 검색된 리퀘스트 문장은 4~500개에 가깝고…

 

그래서 어떻게 편하게 할까 고민해 봤다.

그리고 생각해 난 방법이

이렇게 커넥션 문장 아래에… GET과 POST를 모두 조사해서 DB 문장이 들어오면 에러메시지를 뿌리고 Response.end !!

(사이트 성격에 따라 이렇게 처리해도 무관한 사이트도 있을 것 같아서 올려 봅니다. 참고하세요.!~)

<% 
    Set pConn = Server.CreateObject("ADODB.Connection")

sConnStr = "Provider=SQLOLEDB.1;User ID=" & DB_user_id &

";password=" & DB_user_pass & ";Initial Catalog=" & DB_name &

";Data Source=" & DB_server_name

    pConn.Open sConnStr
    
    	Function DBStringCheck(strRequest,strCompare)
	    if instr(Lcase(strRequest),strCompare) > 0 then

response.Write("오류:입력되지 않아야 할 특수 문자[" &

strCompare &"] 입니다.<BR>관리자에게 문의 바랍니다.")

	    	response.end
	    end if
	End Function
	
	For Each item1 in Request.QueryString
		'//차단할 단어를 입력
		call DBStringCheck(Request.QueryString(item1),chr(39))
		call DBStringCheck(Request.QueryString(item1),"exec")
		call DBStringCheck(Request.QueryString(item1),"select")
		call DBStringCheck(Request.QueryString(item1),"xp_")
		call DBStringCheck(Request.QueryString(item1),"char")
		call DBStringCheck(Request.QueryString(item1),";")

	Next
	For Each item1 in Request.Form
		'//차단할 단어를 입력
		call DBStringCheck(Request.Form(item1),chr(39))
		call DBStringCheck(Request.Form(item1),"exec")
		call DBStringCheck(Request.Form(item1),"select")
		call DBStringCheck(Request.Form(item1),"xp_")
		call DBStringCheck(Request.Form(item1),"char")
          	call DBStringCheck(Request.Form(item1),";")

	Next	 
%>

image

http://www.microsoft.com/downloads/details.aspx?FamilyId=8D933343-038F-499C-986C-C3C7E87A60B3&displaylang=en

실버라이트 2 SDK 를 위의 주소에서 다운받아 설치합니다.

 

C:\Program Files\Microsoft SDKs\Silverlight\v2.0\Documentation\VS-Help\en-us\Readme.txt를 읽어보니

1.       Open Visual Studio (you might have to open VS as an administrator).

2.       In the Help menu, choose Index. Microsoft Document Explorer displays.

3.       In the Filtered by: drop-down, choose to (unfiltered).

4.       In the Look for field, type Collection Manager.

5.       Below the Collection Manager heading, double click Help.

6.       Below the Collections available for inclusion in VSCC heading, check Microsoft Silverlight 2 SDK Documentation.

7.       Click Update VSCC.

이렇게 나오는데 실행하고 3번 필터링 기준을 조절하는 것까지는 알겠는데 Collection Manager는 뭔가?

(아무리 영어로 입력해도 검색이 안되네 –.-)

검색에 VSCC로 검색해 보니 VSCC(Visual Studio 전체 도움말 컬렉션) 이라는 것이 잡힌다.

image

이곳에서 Microsoft Silverlight 2 SDK Documentation 선택하고 VSCC 를 업데이트 해보자!!

그리고 MSDN을 재 시작 하니 도움말을 업데이트 중!!(쫌 걸린다.)

image

요즘에 집에서 블로그를 위해서 가장 많이 쓰는 프로그램은 Windows Live Writer인데…

요것이 항상 아쉬운 부분이 왜 한글은 아직 맞춤법 검사가 되지 않을까? 라는 생각이었다.

그런데… 웹 서핑 중 Windows Live Writer Beta 3 버전에서 한글 맞춤법 검사가 된다는 글을 발견하여

무작정 설치하였다.

[관련 링크:http://www.liveside.net/main/archive/2008/09/16/windows-live-wave-3-betas-download-now.aspx]

Korean
http://g.live.com/1rebeta3/ko/wlsetup-web.exe
http://g.live.com/1rebeta3/ko/wlsetup-all.exe

image

오 UI도 깔끔한데… 이제 베타 티만 내지 않으면 최고인데… 아직까지는 특별히 발견한 문제점은 없는 것 같다.

 image

한글 맞춤법 검사

image

 

아직까지는 맘에 드는걸^^

꼭 바쁜 날 문제가 터지더라~
어쨌든 회사의 홈페이지에 DB를 조회하는 페이지들 스크립트 오류(?)를 내길래 확인해보니
<script src=http://s.ardoshanghai.com/s.js></script> 이런 짱깨의 필이 나는 주소가 잔뜩 들어있더라…...
그래서 구글에 검색해보니…. 헉 7720개….

http://www.google.co.kr/search?complete=1&hl=ko&newwindow=1&q=http%3A%2F%2Fs.ardoshanghai.com%2Fs.js&lr=&aq=f&oq=

(흑 홈페이지 내가 만든 것 아닌데 T.T)
그리하여 찾아보니 http://saybox.tistory.com/453 이렇게 좋은 글이 ^^

저 7720개의 사이트들도 빨리 고쳐져야 할텐데…..


/Q - 자동 모드를 사용하거나 파일 압축을 풀 때 메시지를 표시하지 않습니다.
/Q:U – 사용자 개입 자동 모드를 사용합니다. 사용자 개입 자동 모드는 사용자에게 일부 대화 상자를 표시합니다.
/Q:A – 관리자 개입 자동 모드를 사용합니다. 관리자 개입 자동 모드는 사용자에게 대화 상자를 표시하지 않습니다.
/T: path - 설치 프로그램에서 사용되는 임시 폴더나 파일을 추출하기 위한 대상 폴더(/c 스위치를 사용할 경우)의 위치를 지정합니다.
/C - 설치하지 않고 파일 압축을 풉니다. /t: 경로가 지정되지 않은 경우 대상 폴더를 만들 것인지 묻습니다.
/C: cmd - 이 도구를 설치하는 데 사용할 대체 Setup .inf 파일이나 .exe 파일의 경로와 이름을 지정합니다.
/R:N – 설치 후 컴퓨터를 다시 시작하지 않습니다.
/R:I – 이 스위치를 /q:a 스위치와 함께 사용할 때를 제외하고 컴퓨터를 다시 시작해야 하는 경우 사용자에게 다시 시작할 것인지 묻습니다.
/R:A – 설치 후 항상 컴퓨터를 다시 시작합니다.
/R:S – 설치 후 사용자에게 메시지를 표시하지 않고 컴퓨터를 다시 시작합니다.

벌써 10월 15일 2008년이 시작된 것이 엊그제 같은데.

어느덧 3분기가 지나고 4분기가 보름이나 지났다.

 

연초에 내가 푸푸양에게 2008년 28살에 해야 할 10가지라는 리스트를 준것이 있는데....

(사실상 올해 계획)

얼마나 내가 지켰는지 확인해 보기 위해서 코르크보드에서 해당 문서를 확인해 보았다.

일단 소 제목 과 중간 내 생각들을 적자면....

 

1. 저축

- 이런 한 7월 까지는 잘 한듯 한데 여름을 지나면서 흐지부지 해지고 있다.

- 망가진 펀드가 나를 울게해~

2. 회사

- 1차 목표 달성

- 2차 목표 수행중

3. 가족과의 대화,식사

- 쩝 많이 못했어 올해는 작년보다도 더...

4. 사랑

- 미안!~

5. 여행

- 많이 다닌것 같지만 목표치에는 약간 부족

6. 자기계발

- OTL

7. 쳬력관리 몸관리

- 음!! 보통?

8. 공연관람 및 문화생활

- 10점 만점에 10점!!

9. 종교활동, 사회활동

- 휴~

10. 친구들

- 더 노력하자!!

 

항목 하나씩 보니까 올해도 못하는게 꽤 많을것 같다...

갑자기 생각나서 확인한 올해 목표....

남은 2달 반도 화이팅!! 지키자!! 10만원!!

 

DB 쿼리를 볼일이 있어서 스크랩 함

<출처 : http://blog.naver.com/kikky22?Redirect=Log&logNo=140040666763>

 

ORCLE이 정말 좋은 RDB라는 것을 알게 하는 것이 바로 페이징 기법일거라 생각되네요.
MySQL도 내부적으로 페이징이 가능한 쿼리를 지원해주지만 MSSQL은 최근 2005버전까지도... 좋은 페이징 기법을 소개하지 못하고 있는 것 같네요. 성능 좋은 페이징 기법이 공개된 것이 있기도 하지만... 초심자에게 쉽지 않은 쿼리들인 것 같습니다.
이에 조금 쉽게... 어떻게 하면 성능이 향상되는지를 설명해 보려고 합니다.

아래의 내용은 온라인상에서 바로 작성하는 내용이고 맞춤법등이 틀릴 수 있기 때문에 copy해서 사용하지 마시기 바랍니다.

개념을 잡는 정도로 활용하시면 좋을 것 같습니다.

MS SQL의 페이징 기법의 키는 TOP 키워드입니다.

#1. TOP과  클러스터드 인덱스

SELECT TOP 10 ID, subject, contents FROM TBL

이 쿼리는 누구나 알고 있는 쿼리입니다. 여기서 중요한 것이 TOP 10 입니다.  상위 10개만 갖고 오겠다는 뜻입니다.MSSQL은 내용저장을 클러스터드 인덱스 순으로 저장을 하게 됩니다. 만약 ID를 PK로 지정하셨거나 따로 클러스터드 인덱스로써 ID를 지정해 놓으셨다면 ID순으로 자동으로 정렬이 되어 상위 10개만 가져오게 됩니다.

기본키는 반드시 설정할 필요는 없습니다. 다만 레코드를 구분하는 아이디값을 대게의 경우 기본키로 놓게 되는데요.

사실 기본키가 성능에 있어서의 의미는 없다고 봅니다.(확인된 바 없음)

기본키는 자동으로 인덱스 컬럼이 된다는게 의미가 있겠죠. 그것도 테이블당 딱 하나 사용할 수 있는 클러스터드 인덱스로 자동 설정됩니다. 헌데 문제는 ASC로 설정된다는 것입니다.

웹페이지에서 최근 글의 경우는 대부분 DESC로 정렬합니다. 즉 최근 글을 먼저 표시해주지요. PK로 만들더라도 꼭 ID를 DESC로 인덱스하도록 만들어야 합니다.

바로 이 유일 인덱스 컬럼이 성능을 좌우하는 핵입니다.

초심자의 경우 인덱스의 중요성을 넘기는 경우가 많은데요. PK가 중요한 것이 아니라 정렬을 원하는 컬럼을 클러스터드 인덱스로 만들어 놓는 것이 성능에 가장 중요합니다.(레코드 수가 늘 수록 엄청난 성능 향상이 있습니다.)

팁) TOP 10 PERCENT라는 키워드도 가능합니다. 말 그대로 전체의 10%만 가져온다는 것입니다. 쓸모가 많은 팁이라 생각되네요.

#2. 가장 많이 쓰이는 페이징 쿼리

SELECT TOP 10 ID, subject, contents FROM TBL where ID not in (SELECT TOP 현재페이진 이전까지의 모든 게시물 수 ID FROM TBL order by ID DESC) order by DESC

참 좋은 쿼리입니다. MS SQL에서 나올 수 있는 가장 간결하고 좋은 쿼리가 아닌가 싶습니다.

저역시 작은 규모의 게시판 종류는 무조건 이 쿼리를 이용합니다. 유지보수가 편하기 때문입니다. 누구나 쉽게 알아 볼 수 있기 때문에 제가 도저히 못 봐줄 유지보수 프로젝트라면 다른 사람이 대신할 수 있는 쿼리이기 때문에... 이 쿼리를 즐겨사용합니다.

다만 이 쿼리에는 조건이 하나 붙습니다.

사용자들이 100페이징 이하(게시물 수로 2000개 이하정도)의 글을 되도록 조회한다.

이 쿼리는 2만건 이하의 테이블에 적당하다고 생각됩니다.
1페이지라고 하면 성능이 최고가 되며
2페이지라면 not in 안의 쿼리문에 의해 한페이지가 10개의 글이라고 가정하면 10개를 일단 불러 들이게 됩니다. 제거를 위해서죠.
3페이지라면 20개를 불러들여서 제거를 해야 하겠고
4페이지라면 30개를...

그럼 100페이지라면 990개의 글을 읽어 들여야 겠군요. 990개를 먼저 불러 들이는 것이 문제입니다.

가장 심플한 쿼리이지만 DB에 어느정도의 부하를 주는 쿼리라는 것을 알 수 있습니다.

개인적으로 레코드셋종류의 객체에 내용을 불러오는 쿼리는 0.1초 이전에 끝나야 한다고 생각됩니다. 물론 검색이 들어가면 이야기가 달라지지만 기본적인 형태(아무런 검색이 없는 경우)에서는 0.1초 이하에서 OPEN을 끝내는 것이 좋다고 생각되네요.

#3. ORDER BY문

아시다시피 ORDER BY문은 정렬의 조건입니다. 위 쿼리의 경우 ORDER BY ID DESC이니깐 ID에 대해 내림차순으로 정렬하겠네요. 사실 ORDER BY 문은 안써주는 것이 성능에 가장 좋습니다.

만약 ID를 클러스터드 인덱스로 지정해 놨다면 안써도 될 것 같습니다. 클러스터드 인덱스를 내림차순으로 지정해 놨다면 ORDER BY ID DESC는 성능에 전혀 영향을 미치지 않습니다. 가끔 MSSQL에서 서브쿼리를 썼을 경우 원하는 값을 리턴하지 않습니다. 이유는 모르겠습니다. 서브쿼리문을 가져오는 방법에서 더 빨리 가져오려고 하는 그 부분에서 나오는 문제일거라 생각되네요.

클러스터드 인덱스로 지정했을 경우 ORDER BY ID DESC는 되도록이면 넣으시는게 좋습니다. 정확성을 위해서!;

#4. 성능저하 요소 SELECT COUNT(*) FROM TBL

NOT IN 쿼리보다 심플한 페이징 쿼리는 MSSQL에서 없는 것 같습니다. 개발자 입장에서 프로그래밍하기도 정말 쉬운 쿼리입니다. 현재 페이지 번호만 넘겨주면 모든 것이 가능합니다. 가장 큰 장점이 바로 개발하기 편하다는 것이 겠고, 사용자의 웹접근 액션과도 상당히 잘 맞아 떨어집니다. 사람들은 10페이지 이상은 잘 보지 않으려는 경향이 있기 때문입니다.

NOT IN 쿼리는 생각보다 좋은 쿼리라는 것을 일단 말씀 드립니다. 단 조건은 INDEX를 잘 설정해줬다는 조건이 붙습니다.

게시판 등을 개발할 때 전체 게시물 수를 구해오는데 가장 많이 쓰는 쿼리문이 SELECT COUNT(*) FROM TBL입니다. 페이지 바로 가기 버튼을 위해서도 필요하고 게시물 번호를 붙히는 데도 쓰이기 때문에 쓰는 경우가 많습니다.

헌데 이 쿼리문 속도가 상당히 늦습니다. 100만건을 조회할 경우 1초가 넘어가 버리는 무식한 쿼리입니다. 야야~ 그럼 IDEX행을 가져와봐... 라고 하실 것 같습니다. SELECT COUNT(ID) FROM TBL ... 허나 애석하게 속도가 똑같습니다.

그리고 COUNT함수는 가능하면 (*)를 사용하시기 바랍니다. 이것이 정확한 방법입니다. COUNT(*)에서 속도향상을 위한 방법은 솔직히 말씀드려서 없습니다.

가장 좋은 방법은 테이블 하나를 만들어서 데이타 입력/삭제시마다 업데이트 하면서 게시물 수를 저장해 놓는 방법입니다. MSSQL 내에서는 트리거라는 기능을 제공합니다. INPUT/DELETE 시 UPDATE TBL_SETTING set TBL_COUNT = xxx 뭐 이런 식으로 짜 놓으면 되겠죠.

전체 게시물 수를 가져올 때는 되도록이면 트리거를 쓰거나 프로그램을 통해 정보를 저장하는 테이블에 업데이트하고 이 자료를 페이징시 가져오는 것이 성능을 위한 좋은 방법입니다.

1만건 이하라면 COUNT(*)를 쓰던 NOT IN을 쓰던 별 지장이 없다는 게 제 생각입니다. 고로, 자꾸 써먹어도 좋은 쿼리 들임을 일단 알려드립니다.

#5 성능향상에 가장 좋은 방법

1000만건을 테스트 해보지는 않았지만, 1페이지와 100만 페이지가 같은(해보진 않았죠^^)-혹은 비슷한- 성능을 보이는 쿼리는 다름 아닌 NOT IN보다 훨씬 더 간결한 쿼리입니다.

SELECT TOP 11 ID, subject, contents FROM TBL where ID <= 현재페이지 최상위 ID (order by ID DESC)

이 쿼리에서 가장 중요한 것은 ID가 클러스터드 인덱스로 ID를 설정하고 내림차순으로 지정되어 있어야 한다는 것입니다.

아무리 많은 글들도 0.1초안에 해결될만한 가장 성능이 좋은 쿼리문입니다. 동접자수 엄청나고 글 수가 많다면 이방법 이외의 방법은 사용하지 마시기 바랍니다.

허나 장점이 있으면 단점도 있습니다. 이 쿼리를 사용할 경우 ID값에 바로 접근하긴하기 때문에

이전 1 2 3 4 5 6 7 8 9 10 다음 <- 이와 같은 구성이 불가능하다는 것입니다.

그래서 TOP 10이 아닌 11을 사용한 것입니다. 1부터 10까지 구성은 힘들지만 다음페이지 버튼은 가능하기 때문입니다. 갯수가 11개면 다음 페이지가 있다는 이야기가 되며, 다음페이지의 최상위 ID값도 가져올 수 있게 됩니다.

어쨌거나 위 쿼리는 성능에 있어서는 더이상 좋을 수 없는 쿼리입니다. 분명 글이 많고 사용자 액션이 단순한 사이트라면 반드시 고려해보셔야 할 쿼리입니다. 이전 페이지 구현은 프로그램적으로 머리를 좀 굴려야 할 부분이긴 합니다.

어짜피 다음 페이지 버튼을 눌러야만 가능하니깐 이전 페이지의 ID값은 무조건 가지고 갈 수 있습니다. POST방식으로 이전 페이지 정보를 계속 넘기는 방법도 괜찮은 방법일 것입니다.

SELECT TOP 10 ID FROM TBL where ID > 현재페이지 최상위 ID order by ID ASC 를 어쩔 수 없이 쓰는 것도 한 방법이겠구요. 그래도 다른 쿼리들보다는 빠른 방식이니깐요. <- 이건 저도 테스트 해보진 않았습니다.

#6. 사용자 편의성도 좀 생각해 보자

대부분 웹사이트에서는 NOT IN쿼리가 좋은 방법입니다. 사용자 편의성에 있어서 좋은 선택이니깐요.

이전 1 2 3 4 5 6 7 8 9 10 다음 <- 이게 얼마나 편한 방법입니까^^; 그리고 사람들은 10페이지 이상 조회를 거의 하지 않기도 합니다.

성능을 생각한다면 #5번의 방법이 정말 좋은 방법이지요. 다만 사용자 편의를 위한 인터페이스 구현은 사실상 불가능 합니다. 이전 페이지 구현도 쉽지 않죠.

목표가 생겼습니다.

이전 1 2 3 4 5 6 7 8 9 10 다음

이 기능을 한번 구현해 보죠. 약간 성능 저하가 있더라도... 전체 NOT IN보다는 훨씬 더 빠르게 한다는 목표를 가지고...

일단 쿼리를 하나 보죠.

SELECT TOP pageSize*10+1 ID from TBL where ID <= 1페이지 11페이지 21페이지 등 각 1페이지의 처음 ID

이 쿼리는 페이지 바로가기 버튼 구현을 위한 쿼리입니다.

페이지 사이즈가 10개라고 하면 101개를 가져옵니다. 101개면 너무 많지 않냐 하겠지만 적은 갯수입니다.^^

컬럼이 하나밖에 없기 때문에 속도 저하가 거의 없는 쿼리죠.

이 결과를 가지고 1 2 3 4 5 6 7 8 9 10 다음 버튼 구현이 가능합니다. 이전 버튼 구현은 역시 약간 복잡하죠?

PageInfo = rs.getrows() 등의 좋은 메소드 등을 통해 배열로 만든 후 이 기능을 구현하는 것이 가장 좋은 방법일거라 생각됩니다.

SELECT TOP 10 ID, subject, contents from TBL where ID not in(SELECT TOP pageSize*(현재페이지의한자리숫자-1 / 0일때는 10) ID from TBL  where ID <= 페이지 11페이지 21페이지 등 각 1페이지의 처음 ID order by ID DESC)  and ID <= 페이지 11페이지 21페이지 등 각 1페이지의 처음 ID order by ID DESC

이 쿼리는 실제로 글을 뿌려주는 쿼리입니다. NOT IN이 쓰였네요. 하지만 10페이지 단위로 끊어서 10페이지 글 내에서 NOT IN을 사용하기 때문에 항상 빠른 속도를 내줄 수 있는 쿼리입니다.

페이지당 글 수가 아무리 많아도 100개 이하가 대부분이기 때문에 10페이지 단위로 끊는다고 해도 1000개의 글 내에서 모든 작업이 이루어지기 때문에 성능 저하는 거의(아예) 없다고 보시면 됩니다. 1000개정도 레코드는 아무것도 아니지요.

다만 걸리는 것은 페이지 바로 가기 버튼을 구현하기 위해 비슷한 쿼리를 두번 날렸기 때문에 두배의 비용이 든다는 거겠지요.

#7. 검색에 대한 이야기

검색 속도를 위한 가장 좋은 방법은 고가의 검색 엔진을 사용하는 것입니다. 검색엔진에 DB를 설정하고 URL 저장 방법만 설정해 놓고 스케쥴링만 해 놓으면 검색엔진은 알아서 DB를 검색하고 고쳐진 값에 대해서 URL 링크를 인덱싱해 놓습니다.

속도도 빠르고 한글의 경우 형태소 분석기를 통해 별에 별 검색도 가능하며 서비스 측면에서는 하일라이트 생성기등을 통해 사용자 편의성을 제공해주고... 뭐... 문제는 쩐이군요^^;

MSSQL에서 우리는 like '%xxx%' 검색을 많이 활용하게 됩니다.

SELECT ID, subject, contents from TBL where subject like '%xxx%'

이 쿼리는 xxx를 가지는 모든 subject 컬럼에 대해 검색을 하게 됩니다. 그럼 어떻게 해야 할까요. 넵~ 인덱스를 설정해야 합니다. subject에 대해서 넌클러스터드 인덱스를 설정해 주어야 합니다. 그러면 엄청난 속도 향상을 느낄 수 있습니다.

subject 는 varchar(255)형입니다. 그렇기 때문에 인덱스 설정이 가능합니다.

그럼 contents like '%xxx%'는?

헌데 contents가 text형이거나 varchar(max) (이건 2005에서 지원)라면?...

불행히도 인덱스를 줄수가 없습니다. MSSQL은 그다지 많은 인덱스 공간을 지원해주지 않습니다.

이경우 가능하면 input쪽에 varchar(4000)정도 만큼만 글을 입력하도록 제한하거나 varchar(4000)을 몇개 더 만들어서 DB저장시 나누어서 넣어주는게 좋습니다.

편법이고 지저분한 방법입니다.^^; 그래도 뭐 속도 향상이 있다면야... 모두들 어쩔 수 없이 text형도 검색을 하지만, 좋은 방법이 아닙니다. 글이 1만개만 넘어가다 상당한 부하가 걸릴 거라 생각됩니다.

넌클러스터드 인덱스만이라도 걸려 있다면, 성능은 무척 좋아집니다.

하지만 너무 방법이 지저분 하네요.

더좋은 방법이 있겠죠? MSSQL은 이런 경우를 위해 풀텍스트검색서비스를 지원합니다. varchar(MAX)나 text형 등을 시중의 검색엔진과 비슷한 방식으로 인덱싱하고 검색할 수 있는 방법은 제공합니다. 속도가 그렇게 좋지는 못합니다만...  형태소 분석기도 들어 있고 유사어 검색도 가능하고 정확도 정렬도 가능합니다. 다만 문제는 속도가 생각처럼 나오지는 않는 다는 것입니다. 특히 정확도 정렬을 위한 정렬의 경우 100만건 이상으로 테스트시 1초가 넘어가더군요.

그리고 MSSQL 2000에서 한글은 제대로 지원되지 않았습니다. 2005에서 한글 지원이 되는데... 실제로 띄어쓰기를 하지 않아도 검색이 되는 정도를 확인하였습니다. 동의어 검색도 가능하다고 하는데... 저역시 많은 테스트가 필요할 것 같습니다.

2000에서는 전혀 안쓰는 기능이었지만, 2005에서는 충분히 활용가치가 있을 것 같네요. 다만 호스팅 업체에서 이 기능을 지원하지 않는 다는 것이 가장 큰 문제입니다.^^; 인덱싱 속도는 꽤 빠르나 하드디스크를 많이 차지하기 때문에, 그리고 인덱싱시 꽤 부하를 주기 때문에 지원하지 않는 것 같으며, 2000의 경우 한글 인덱싱 자체가 잘 안되기 때문에 지원을 하지 않는 것 같습니다.

다만 MSSQL 2005라면 프로젝트에 충분히 쓸 수 있을 것도 같습니다. 제가 이번에 활용해보도록 하겠습니다.

상용검색엔진에 비하면 못하겠지만 어느정도 흉내를 내주고 CONTAINS(TABLE)/ FREETEXT(TABLE)등의 4개의 함수를 통해 SQL쿼리문 내에서 사용하기 때문에 개발하기가 수월합니다.

풀텍스트 검색엔진에 대한 이야기는 또 다음에 계속 하도록 하겠습니다.

정리;
속도 향상을 위해 가장 중요한 것은 바로 INDEX 설정!;

'OS, DB > SQL,DB' 카테고리의 다른 글

오라클 개행문자 제거하기  (0) 2009.02.20

실버라이트 2.0의 정식 출시가 14일에 될 것으로 알려지고 있습니다.

관심 있으신 분은 확인해보세요.!!

http://silverlight.net/blogs/jesseliberty/archive/2008/10/13/silverlight-2-releases-tomorrow.aspx

오후에 출시 되었군요!!!
실버라이트 닷넷으로 고고씽!!