C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[14564] 업무개발을 하실 때 DB 성능을 얼마나 고려하시나요?
박지훈.임프 [cbuilder] 3896 읽음    2008-05-30 18:08
아시다시피 업무개발, 속칭 SI 개발에서는 DB의 성능이 전체 시스템의 성능을 대부분 좌우합니다.
애플리케이션 자체의 응답 속도는 대단히 빠른데 디비에서 데이터를 쿼리해오고 또 인서트, 업데이트하는 데에 많은 시간이 걸리니까요.

제가 여러번 프로젝트를 하는 동안에도 이런 면 때문에 종종 델파이/C++빌더 애플리케이션 자체보다 DB 최적화에 더 신경을 많이 쓰기도 했습니다. 덕분에 쿼리 튜닝도 주먹구구식이긴 하지만 꽤나 할 수 있게 되었고, 디비의 설정이라든지 그런 것들도 많이 살펴보게 되었습니다.

그런데 저번 회사, 얼마전에 그만둔 회사가 데이터베이스 성능관리 전문입니다. 그래서, 데이터베이스의 성능 관리에 있어 쿼리 튜닝과는 다른 또다른 레벨을 좀 맛보고 나왔습니다. 회사에서 출간했던 데이터베이스 성능관리 관련 고급 서적들도 여러권 갖고 나왔는데, 요즘 짬짬이 보고 있습니다. 회사 다니는 동안에는 제대로 신경쓰지 못했던 기술들이 시간 여유를 가지고 살펴보니 꽤 재미있더군요. 무릎을 탁 치게 만드는 부분들도 꽤 있습니다.

델파이/C++빌더로 진행하는 업무 개발이 적지 않지만, 상당수가 중소규모 프로젝트죠. 대형 프로젝트는 다수가 자바로 진행되고 일부는 닷넷으로 진행되기도 합니다. (그래도 아직 닷넷의 입지는 자바에 비교할 바가 못되죠) 그러다보니 전문 DBA나 모델러 등 데이터베이스 전문가가 따로 있는 프로젝트는 거의 들어보지 못했던 것 같습니다. 작년 중반까지 다녔던 듀오에서도, 제가 상당히 경험이 있는 직원 한명을 DBA로 지정하고 그리로 키우려고 무지하게 애를 썼는데 회사측의 비협조로 별로 성과가 없었습니다.

결국, 델파이/C++빌더로 진행되는 프로젝트들의 다수는 개발자가 DB 아키텍처와 성능 부분도 함께 떠맡고 가게 되는 경우가 흔해집니다. 이건 뭐, 비단 델파이/C++빌더 뿐만 아니라 자바에 비하면 윈도우쪽 프로젝트가 대부분 중소규모이고 디비 전문은 따로 없는 경우가 비일비재합니다.

이전 회사의 SQL 서버 전문 컨설턴트들이 컨설팅을 나가서 가장 애로를 느끼는 점이, 오라클쪽과 달리 해당 사이트에 DBA가 아예 없거나 있어도 전문성이 떨어진다는 점, 그리고 개발자가 디비를 같이 맡고 있는 경우가 흔해서 결과적으로 디비 컨설팅 외에 애플리케이션 개발에 대한 컨설팅도 함께 진행해야 하는 경우가 잦다는 점이었습니다.

결과적으로, 우리 포럼에도 업무 개발을 하시는 분이 꽤 있으실 텐데요. 디비 성능 관리는 어떻게 신경쓰시고들 있으신지요? 사용하는 디비도 오라클에서부터 MS SQL 서버, 파이어버드, MySQL 등 다양하실텐데요. (아마 DB2는 거의 없을 듯)

음... 혹시 큰 장애만 안생기면 돌아가는 대로 그냥 둔다?
아니면... 나름대로 열심히 찾아보고 해서 여러가지 시도를 해본다?

그러나저러나... 제가 프로그래밍에 입문하던 90년대 초부터 데이터베이스가 중심인 개발은 제일 하기 싫었던 분야였는데, 어떻게 살다보니 몇년새 업무 개발과 데이터베이스 전문 비슷하게 되어버렸습니다. 참 산다는 건... 알쏭달쏭하죠?
준초보 [jangsek1]   2008-05-30 18:34 X
제경우엔 많이 신경씁니다
하나,둘,셋에 자료가 안나오면 불안하거든요
그렇다고 튜닝을 할정도로 기술이 좋지는 않고
SI 에서 뛰다보니 깊이가 없다는 점도 있고요
제경우엔 50%정도 신경쓰는거 같습니다

예전에 DB2 쓴적있는데 그것도 파일버젼인가 그랬습니다
미들웨어 하나쓰고 유지보수했는데 개발하신 분이 아마도 시간이 없으셔서
신경을 안썼는지 무진장 고생했습니다

ORACLE,MSSQL,DB2,PARADOX,FIERBIRD 다 용도에 따라 일장일단이 있더군요

이전 프로젝트때 FIERBIRD  로 로컬 프로그램 개발했는데
볼포에서 아주많은 도움을 받았습니다

새삼 감사드립니다.
박지훈.임프 [cbuilder]   2008-05-30 20:02 X
아, 준초보님 기억납니다. 반갑네요.
특히 성능에 많이 신경쓰신다니 더 반갑습니다.
일정에 쫓기고 요구 사항에 쫓겨다니는 업무 개발에서 디비 성능 문제에 제대로 신경을 쓰는 개발자가 얼마나 될까 싶어서 좀 회의적이었거든요.
저 혼자만 쌩쑈하는 게 아닌가 싶어서... ^^
아제나 [azena]   2008-05-30 20:53 X
전 스토어드 프로시져까지는 안 쓰지만(스토어 프로시져 저주합니다 ㅋㅋㅋ), 디비는 엄청 신경써서 만듭니다. 실제로 코딩할 때도 서브쿼리 및 조인을 이용해서 최적의 결과를 불러오기 위해서 노력하죠.
가끔 쿼리 한 문장이 화면에 꽉 차는 경우도 있지요. 친구 프로그래머 녀석이 보고 엽기 쿼리라고 했던;;;;;

부하를 줄이는 가장 간단한 팁을 소개하자면,
게시판을 예로 들어서 설명드리겠습니다.
게시판은 최근 게시물이 가장 위에 올라오는 구조기 때문에 시간의 역순값을 구해야 합니다. 보통 시간은 timestamp를 많이 저장하실텐데요.
이 때 timestamp 값으로 order by desc를 써서 소트하시는 분들이 많을 겁니다.

하지만 order by 쿼리는 데이터베이스 풀스캔을 가져오기 때문에 엄청난 부하를 주는 아주 나쁜 방법입니다.

이 때 쓸 수 있는 것이 not 연산자죠. 데이터베이스에 저장하기 전에 not 한번해서 비트를 역전시켜줍니다. 그러면 시간이 지날수록 값이 작아지기 때문에 order by 안 써도 WHERE 문에 timestamp를 걸어주면 timestamp로 알아서 역순 소트되어 나옵니다.

즉, 쿼리에서 order by를 생략해도 알아서 소트되어 나오는 것이죠. 대부분의 경우에는 이것만 제대로 적용해도 엄청난 데이터베이스 부하를 없앨 수 있죠.

이 외에도 디비 튜닝을 위한 각종 방법은 익혀두면 뼈가되고 살이되는 것 같습니다.
저도 7년전에 SQL 무지 열심히 공부했는데, 지금은 귀찮아서 ㅡ.ㅡㅋㅋㅋ
아제나 [azena]   2008-05-30 21:03 X
무엇보다도 배움에 대한 욕구가 가장 중요한 것 같습니다.
솔직히 시간이 없어서 못하는 것보다 귀찮아서 안 하는게 맞을 겁니다.
정말 시간이 없으면 DDONG 싸러 가는 시간도 없을 정도는 되어야지 시간이 없다는 핑계를 댈 수 있겠죠 ㅡ.ㅡ;;
아..얌얌..
노진 [youngalex]   2008-05-30 23:36 X
묻어가며 잠깐 여쭙고 싶은 것이 있는데요....^^
3 tier 환경에서 디비그리드사용은 어떻게 생각하십니까?
만약 불가피하게 사용을 해야하는 상황이 발생해서 어쩔수 없다면요...

아니면 그냐 서버어플쪽에 쿼리 날리고 리턴되는 데이터 셋을 클아이언트 쪽
스트링그리드에 뿌려주시나요?

디비그리드에 만약 결과값 데이터 셋을 뿌려야하는 상황이라면 풀스캔에 의한 부하를
막기위해서 packetrecords 에 적절값을 넣어줌으로 필요한 만큼의 팩킷 형식으로
조금씩 자료를 가져오잖습니까?
그때 서버어플리케이션쪽에서 저는 두가지 형식으로 개발을 합니다.
한가지는 그냥 쿼리 콤포 떡 하니 얹어놓고 직접 쿼리문 날린것으로 데이터셋을 리턴받기도 하고
다른 한가지 방법은 쿼리를 올려놓고 데이터셋을 리턴하는 쿼리문은 스토 프로시져를 먼저 만들어놓고 그 다음 데이터 셋을 받아오는 식으로 짜기도 합니다.

궁금한 점은 위에 제시한 두가지 상황에서는 과연 스토프로시져 의 사용이 정말 체감할수있는 퍼포먼스를 가져다 줄수 있을까 해서요...

별차이 없다면 스토프로시져는 정말 쓰고 싶지 않아요...^^
 

크레브 [kkol]   2008-05-31 09:34 X
DB성능을 select 문 관점에서만 생각하실지 모르겠지만...

저는 임베디드 파이어버드와 dbExpress 콤포넌트를 이용해 간단한 레코드를 Insert  하는데 걸리는 시간이 PC사양에 따라 2ms ~ 5ms 걸리더군요
중간중간 OS의 상태에 따라서 100ms 이상 걸리는 경우도 있습니다.

이정도 시간이면.. 1초당 200개의 레코드정도 밖에 저장할 수 없다는 결론인데..
현재 개발 하는 프로그램에서는 보통 1초당 10~60개 정도의 레코드가 추가되기 때문에
큰 문제는 없지만..
이것이 1년내내 24시간 저장되어야 하는 문제라 성능을 떠나서 안정성에 문제가 없는지 걱정입니다.
다른 프로그램과 함께 동작해야 하기 때문에 성능도 좀더 개선할수 있는 방법이 있으면하죠

그리고 계속 이렇게 저장하다보면 레코드 개수가 100~200만개 넘는것은 시간문제인데..
전체 레코드에서 단순 select LIKE 문으로 검색을 하기가 겁나네요.. ㅋㅋ
뭔가 다른 방법을 생각해보고 있습니다.

아제나 [azena]   2008-06-01 01:40 X
인서트가 그렇게 오래 걸린다면 인덱스가 너무 과다하게 걸려있던가 테이블 자체가 너무 커서 그런 것 같네요. 레코드가 100만 넘어가면 뭔가 다른 대책을 세워야 합니다.
레코드가 전부 몇개 있는지 알아보려고 COUNT()만 해도 2-3ms씩 걸리죵 ㄷㄷㄷ
200-300만 레코드 넘어가면 풀스캔은 절대적으로 자제해야죠.
결국 설계 문제인 것 같습니다.

+ -

관련 글 리스트
14564 업무개발을 하실 때 DB 성능을 얼마나 고려하시나요? 박지훈.임프 3896 2008/05/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.