Background Image

FORUM

조회 수 11988 추천 수 0 댓글 3
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부


큐브리드의 컴포지션 기능을 활용하여 테이블을 구성했습니다.

ymd_base
yy  char(4)     -----|
mm char(2)         |   PK
dd char(2)     ------|

counter
ymd ymd_base --|    Unique Index
cnt int


위와 같이 구성을 하고 아래와 같은 쿼리를 구성을 했습니다.

select cnt, incr(cnt) from counter where ymd.yy='2010' and ymd.mm='02' and ymd.dd='11';

cnt 값이 0 이상이면 위 쿼리로 종료를 하고 아니라면
ymd_base 테이블에 오늘 날짜의 yy,mm,dd가 있는지 select 해보고 없으면
insert를 하고 counter 테이블에는 무조건 insert를 하게 되어 있습니다.

그런데.. 아래와 같은 결과가 나옵니다.
초당 요청 수나 트랜젝션 수가 그렇게 많지는 않은 듯 한데..

CPU 사용률이 700% 정도 나오네요;;;;

큐브리드 설정 부분이 잘 못된 것인지..
아니면 쿼리나 테이블 구성 등을 잘못 쓰고 있는지 모르겠습니다.
그리고 PHP 에러 로그로 아래와 같이 찍힙니다..


PHP Warning:  Error: DBMS, -76, Your transaction (index 2, dba@ems|30432) timed out waiting on WRITE on page 0|2677. You are waiting for user(s) pd@ems|2950 to release the page lock.


감을.... 잘 못잡겠네요;;;;
CPU사용률이 높은 이유와..
위의 PHP에러가 발생하는 이유.. 에 대한 설명과 해결 방법을 문의 드립니다;;;

ps. 새해 복 많이 받으세요~




PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

30530 cubrid    15   0 1410m 143m 3140 S 731.2  1.9 517:57.53 cub_server


Process 30530 attached - interrupt to quit

select(1024, [9], NULL, [9], {3, 728000}) = 0 (Timeout)

fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)

select(1024, [9], NULL, [9], {5, 0})    = 0 (Timeout)

fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)

select(1024, [9], NULL, [9], {5, 0})    = 0 (Timeout)

fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)

select(1024, [9], NULL, [9], {5, 0})    = 0 (Timeout)

fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)

select(1024, [9], NULL, [9], {5, 0})    = 0 (Timeout)

fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)

  • ?
    남재우 2010.02.16 19:14
    안녕하세요.
    답변이 늦어서 죄송합니다.
    일단 올려주신 예는 사용하기에는 적절치 않습니다. 왜냐하면 단순히 연월일을 참조하기 위해 별도의 테이블을 만든다는 것은 성능적인 관점에서는 한개의 테이블에서 가능한 데이터를 두개의 테이블을 참조해야 하기 때문입니다. 또한 검색과정에서 인덱스의 설정도 문제가 됩니다. 일단 ymd_base의 검색조건에 대한 인덱스가 있어야 함은 당연할 것으로 보이며, 예에서는 PK가 할당되어 있으니 문제는 없습니다.또한 컴포지션 구성시 중요한 것은 컴포지션 관계를 가지고 있는 필드에 대하여 인덱스가 필요할 수 있다는 것이며, 이와 같이 메인테이블에서의 검색이 아닌 참조되는 테이블에서 검색한 정보를 이용하는 경우에는 그 필드(counter 테이블의 ymd 필드)에 인덱스가 있어야 합니다. 예에서는 unique 설정이 되어있으니 또한 스키마 자체에는 문제는 없습니다.
    그러나 앞서 언급한 것처럼 두개의 테이블을 사용하면 하나의 테이블을 사용하는 것보다는 성능이 좋지 않습니다. 이점 충분히 고려해야 합니다.
    CPU 사용률이 높은 것은 데이터 건수(검색대상, 검색 결과 모두)와 관련이 있습니다. 아무래도 데이터가 많다면 CPU는 많이 사용될 것입니다. 다만 그 CPU가 CUBRID 관련 프로세스(cub_*)의 것인지, 아니면 전체적으로 사용률이 높게나오는 것인지 확인을 부탁합니다.
    또한 에러는 lock timeout 에 대한 부분입니다. lock을 잡으려고 대기하다가 주어진 시간동안 lock을 잡지못해 발생시키는 에러입니다. 따라서 에러를 내는 곳이 문제가 아니고 lock을 오래잡고 있는 곳을 찾아야 합니다. 이 작업중 다른 작업이 있었는지 확인을 부탁드립니다. 특히 관리상(스키마 작업, 대량의 데이터 입력/수정/삭제 등)의 작업이 있었는지 확인을 부탁합니다.

  • ?
    野花 2010.02.18 09:40
    답변 감사합니다.. ^^

    우선.. cpu 사용은 cub_server 에서 대부분 차지합니다.
    위에 top 내용을 적어 두었지만, cub_server 라는 프로세스 1개가 700% 이상 cpu를 점유하고 있습니다.
    그리고, strace로 프로세스를 확인해 보면 select를 하고 있는 것으로 보입니다.

    위에  QPS및 TSP 관련해서 첨부로 올렸지만, QPS는 많으면 50-60 정도입니다.
    MySQL innodb(메모리 4G용 my.cnf)로 비슷한(스키마와 인덱스, PK는 다름) 경우에도 QPS는 비슷한 수준으로 나옵니다.

    대부분의 쿼리는 select 후에 Update 및 Insert입니다.
    MySQL의 InnoDB에서도 select for update 등을 사용하더라도
    데드락이 4-5초 간격으로 계속 발생하여 on duplicate key update를 사용해서
    방지하고 있습니다. 

    위처럼 구성한 것은 컴포지션과 관련한 예제라던가 적절한 사용 후기 등이 없어
    이런 경우에 구성이 가능한 것인가 확인차 테스트를 해본 것입니다.

    어렵네요;;; 새로운 개념 적용 시키기가;;;
  • ?
    남재우 2010.02.19 00:42
    안녕하세요.
    CUBRID에서 구지 개체개념을 사용하실 필요는 없습니다. 그냥 관계형으로 편하게 사용하시길 권장합니다. 말씀하신 것처럼 새로운 개념은 사용법도 중요하지만 성능적인 관점이 항상 따라다니기 때문에 간단히 적용하기가 쉽지는 않습니다.
    참고로 select 후 update/insert 라면, 데이터가 있으면 update, 없으면 insert 를 하는 것으로 보입니다. 그렇다면 insert 가 많은 경우라면 insert 를 먼저하고 에러가 발생하면(unique error겠죠) update 를 하도록 하고, 그렇지 않고 update 가 많다면 update를 먼저해서 update 된 건수가 0건이면(이건 대부분의 프로그램에서 건수를 확인할 수 있으니) insert 를 하도록 하는 것도 성능을 올릴 수 있는 방법입니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 1158
556 테이블 복구 1 mydream 2010.02.26 10524
555 mssql -> cubrid 데이터 이전시 문제 4 종이 2010.02.25 22492
554 Like 문이 의도하지 않은 결과값을 반환합니다. 3 이진혁 2010.02.25 12399
553 한글메세지 출력 방법에 대해서.. 4 모야 2010.02.25 12448
552 555번 한글테이블 글 올린 사람입니다 (화면캡쳐함) 1 유니콘 2010.02.23 11725
551 저장프로시저 함수-loadjava 3 쪼로롱 2010.02.23 15492
550 group by 오류 3 초보 2010.02.23 12479
549 테이블명을 한글로 할 수는 없나요? 3 유니콘 2010.02.22 12736
548 timestamp 필드 데이터를 다시 timestamp로 변환하기 1 byblog 2010.02.20 12593
547 리눅스상에서 백업파일의 Backup Time을 알수있는 방법이 있나요? 1 럭키늘보 2010.02.19 9968
546 restoredb 이용한 복구가 제대로 되지 않아요. 4 럭키늘보 2010.02.18 12828
545 설치 완료후 phpcubAdmin 에서 페이지 열기가 안됩니다. 2 마루정 2010.02.12 10003
» 컴포지션 관련해서 문의 드립니다. 3 file 野花 2010.02.12 11988
543 리눅스 설치 확인 부탁 드립니다. 1 Philip Park 2010.02.12 10429
542 // 를 사용하고 싶습니다. 1 죽통군 2010.02.10 9533
541 큐브리드 매니저에서 오류 5 file 초보 2010.02.10 10289
540 내부 아이피 연결시 접속이 안되는 현상 5 초보 2010.02.10 13502
539 Spatial Extensions 지원하나요? 2 온니발란스 2010.02.09 14210
538 542번글 재질의 2 file 초보 2010.02.09 9761
537 MS-SQL 데이타타입/함수비교 2 webdoors 2010.02.09 16540
Board Pagination Prev 1 ... 139 140 141 142 143 144 145 146 147 148 ... 171 Next
/ 171

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2147 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales