Background Image

FORUM

조회 수 145 추천 수 0 댓글 9
?

단축키

Prev이전 문서

Next다음 문서

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


58302A2A-C87C-4A17-8639-5E599F8937C2.jpeg* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
OS
Window7 32bit, Linux 64bit 등
CUBRID Ver.
[cubrid_rel] 수행 결과 9.3.9.1502
CUBRID TOOL Ver.
[도움말]-[버전정보] 확인
응용 환경(API)
java, php, odbc 등 입력

* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축

-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------첨부한 사진을 보면 NX_LOCK이 발생하고 있는데요. 실행 계획을 보면 영 엉뚱한 인덱스를 타고 있습니다. 해당 쿼리를 보면모두 DOCID = ? 컬럼을 pk 컬럼을 조건절로 사용하는데 3개 쿼리가 동일하게 DOCID가 없는 인덱스를 엑세스 패스로 잡고 있습니다. 힌트로 고정을 해야 하는 것인지, 통계수집을 다시 해야 하는 것인지 문의 드립니다. 총계수집이 필요하면 명령어도 부탁 드립니다.

  • ?
    Philip Park 2020.11.26 11:00
    어떤 상황에서 이 같은 현상이 발생할수 있는지 답변 부탁드립니다. 3개 테이블은 저희 시스템에서 데이터량이 제일 받은 테이블이고 수정/삭제도 많이 일어나는 테이블입니다. 그래서 현제 매일 락이 발생하고 있습니다.
  • ?
    정훈 2020.11.26 13:43
    NX_LOCK 과 테이블의 인덱스를 타는 거랑은 별개 입니다.

    NX_LOCK은 다음 경우에 인덱스 키에 잠금을 획득합니다.
    고유 키가 존재하는 행에 대해 UPDATE, DELETE 작업을 수행할 때 해당 작업이 영향을 주는 범위를 보호하기 위해 해당 범위 이전 키와 다음 키에 잠금을 획득한다.

    문제의 요인이 쿼리가 인덱스를 잘못타는 것 때문인지, NX_LOCK으로 인한 LOCK_TIMEOUT이 빈번히 발생하는 것이 문제인지 확인해보세요.
  • ?
    Philip Park 2020.11.26 14:08
    그 확인 방법을 어떻게 해야 하나요? 잘뭇된 인덱스를 스캔함으로써 락타입 시간이 길어지고 있어서 발생하는 것으로 보이는데 정상적인 인덱스를 타게 할려면 어떻게 해야 하나요? Pk컬럼을 찍어서 조회를 하는데 엉뚱한 인덱스를 타는게 정상은 아닌거 같은데요?
  • ?
    정훈 2020.11.26 14:13
    엉뚱한 인덱스를 보시는 해당 테이블의 스키마 정보와 수행하신 쿼리를 첨부해주세요.
    에러 로그에 보시면 lock time out으로 트랜잭션이 실패한 로그도 기록 됩니다.
  • ?
    Philip Park 2020.11.26 14:37
    테이블 하나의 스키마 올려 드립니다. 쿼리는 먼저 올려드린 첨부파일에서 확인 가능 하십니다.
  • ?
    허서진 2020.11.26 14:59

    올려주신 테이블 스키마와 lock 정보를 보면, ix_tlk_doc_path02,06 인덱스의 중복도가 높아 다수의 row에 lock이 발생하는 것으로 추정됩니다.
    인덱스 중복도를 낮추기 위해 해당 인덱스에 pk컬럼을 추가하여 중복도를 낮춰 보실 것을 권고드립니다.
    예시 : ix_tlk_doc_path02(objtype,reportdt,docid,pathorder)

    더 정확한 설명이 필요하신 경우에는 $CUBRID/log/server/db명_가장최신날짜.event 파일에 나와 있는 lock_timeout 에러로그 첨부 부탁드립니다.
    위에서 설명한 것과 같이 lock정보와 실행계획은 별개입니다.
    자세한 내용은 매뉴얼 참고 부탁드립니다.
    감사합니다.

  • ?
    Philip Park 2020.11.30 09:52
    02번 인덱스를 타면 안된다고 하니 그 인덱스에 pk컬럼을 추가하라는게 맞나요?? delete 절에는 docid만 들어왔는데 docid가 선행 컬럼인 pk, 05, 08 인덱스 중에 탔다면 어느 정도 이해가 가겠지만 docid 컬럼이 없는 02번 인덱스를 타는 상황이라 인덱스나 해당 테이블의 통계정보 수집할때 사용하는 명령어 좀 알려 주세요.
  • ?
    Philip Park 2020.11.30 11:16
    event 파일 일부 올려 드립니다. lock_timeout 많이 보이는데 전체 파일 없어도 확인 가능 한가요? 인터넷이 안되어서 휴대폰으로 올립니다.
  • ?
    주영진 2020.11.30 12:30
    안녕하세요.

    0C77BC6A-0317-48E7-B103-927A292A32D4.jpeg 파일에서 lock 항목에 index=ix_tlk_doc_path_02 라고 나오는 부분은
    delete 쿼리 실행 시 where 조건에 해당하는 row를 찾기 위해 ix_tlk_doc_path_02 인덱스를 사용했다는 내용이 아닙니다.
    그렇기 때문에 where 조건에 해당하는 row를 찾기 위해 docid가 선행 컬럼인 인덱스를 사용하는 것과 무관합니다.
    그리고 통계정보를 다시 수집하는 것과도 무관합니다.

    이 현상은 delete 쿼리 실행 후 commit 하기 전까지
    ix_tlk_doc_path_02 인덱스에서 영향을 받는 page들에 lock을 잡는데
    이 lock을 기다리다가 lock timeout으로 에러가 발생하는 현상입니다.

    --------------------------------------------------------------------------------
    CUBRID 9.x 버전에서는 인덱스 사용 또는 수정 시 lock을 잡고 있습니다.
    CUBRID 10.x 버전에서는 인덱스 사용 또는 수정 시 lock을 잡지 않도록 개선됐습니다.
    --------------------------------------------------------------------------------

    첨부해주신 event 로그를 보고 추가 설명드립니다.

    tlk_doc_appr_recb 테이블에 delete 쿼리를 포함하고 있는 트랜잭션이 실행 중일 때
    where 조건에 해당하는 row가 변경되므로 인해 영향을 받는 ix_tlk_doc_path_02 인덱스의 page들에 lock을 잡습니다.
    * 참고1: ix_tlk_doc_path_02 인덱스 외에 다른 인덱스들도 lock을 잡습니다.
    * 참고2: delete 쿼리가 다른 쿼리들과 트랜잭션으로 묶여 있다면, delete 쿼리 실행이 종료되더라도 트랜잭션 전체가 종료될 때까지 ix_tlk_doc_path_02 인덱스에 잡은 lock을 풀어주지 않습니다.

    ix_tlk_doc_path_02 인덱스는 objtype, reportdt 컬럼으로 구성하고 있어서
    docid가 다르더라도 같은 objtype, reportdt 컬럼값을 가지는 row들은
    영향을 받는 인덱스 페이지에 포함되기 때문에 ix_tlk_doc_path_02 인덱스에 잡은 lock을 풀어주기 전까지 변경이 불가능합니다.

    이후에 tlk_doc_appr_recb 테이블에 update 쿼리가 실행됐는데
    앞서 delete 했던 row와 docid는 다르지만 같은 objtype, reportdt 컬럼값을 가지는 row들을 변경하려고 하면서
    해당하는 ix_tlk_doc_path_02 인덱스 페이지들에 lock을 잡기 위해 기다리다가 lock timeout으로 에러가 발생한 것으로 보입니다.

    이 현상을 개선하기 위해서는 두 가지 방법이 있습니다.

    1. delete 쿼리가 다른 쿼리들과 트랜잭션으로 묶여 있다면, 트랜잭션을 분리해서 delete 쿼리 실행 후 바로 commit 하도록 하는 방법
    * 트랜잭션이 끝날 때까지 기다리면, delete 쿼리 실행이 종료되더라도 트랜잭션 전체가 종료될 때까지 인덱스에 잡은 lock을 풀어주지 않기 때문에 게시글과 같은 현상이 발생합니다.

    2. 앞선 comment에서 언급하고 있는 ix_tlk_doc_path_02 인덱스의 중복도를 낮추는 방법
    * ix_tlk_doc_path_02 인덱스에 중복도가 낮은 컬럼(docid)을 추가하면 인덱스 전체의 중복도를 낮출 수 있습니다.
    * 이렇게 하면 delete 쿼리가 ix_tlk_doc_path_02 인덱스에 lock을 잡는 page가 줄어듭니다.
    * ix_tlk_doc_path_02 인덱스에 docid 컬럼을 추가한 경우 objtype, reportdt, docid 등 3개 컬럼 값이 같은 page들만 lock을 잡기 때문에
    * delete 했던 row와 docid가 다른 row들을 변경하는 update 쿼리를 실행하면 lock을 잡는 page가 겹지치기 않기 때문에 lock timeout 에러가 발생하지 않습니다.

    대부분의 설명은 앞선 comment에서 다 해주신 것 같으나 내용 정리가 필요할 것 같아서 추가 comment를 작성했습니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 863
3349 내보내기 이성진 2021.01.20 8
3348 이중화 관련해서 질문 드립니다. 2 코코코지마 2021.01.20 22
3347 테이블에 인덱스 추가시 사용자가 해당 테이블에 update, insert 등 할경우 lock 시간이 걸리는지요? 1 cho 2021.01.19 18
3346 Max Client 모니터링 방법 1 nagh 2021.01.18 20
3345 CUBRID Manager 오류 메시지 및 드라이버 버전에 따른 접속(DB 접근) 문제 1 뽀대남 2021.01.15 20
3344 loaddb로 백업시 clob 타입 사용시 문의 3 Seonu 2021.01.12 30
3343 Unloaddb로 백업 시 특정 테이블만 백업이 안되는 경우도 있나요? 3 Seonu 2021.01.11 37
3342 [-830]Cannot allocate query entry any more. Maximun allocatable entries are 100 1 dasomoh 2021.01.07 23
3341 특정 Table만 백업하는 방법 1 nagh 2021.01.06 20
3340 큐브리드로 두 날짜간의 년도 차이를 구하고 싶습니다. 1 aaa 2021.01.04 23
3339 usegeneratedkeys 와 같은 기능 사용법 1 망나니개발자 2020.12.30 15
3338 cannot connect to a broker 접속오류 관련 문의 드립니다. 2 zerorogue 2020.12.29 45
3337 방화병 포트 오픈시 양방향 오픈을 해야 하나요? 2 Philip Park 2020.12.29 34
3336 큐브리드 UTF8 일시 3byte 궁금 증 1 덴드로비움 2020.12.29 22
3335 TO_DATETIME 함수 문의 드립니다. 2 풍류인생 2020.12.29 21
3334 데이터 볼륨을 추가 하는 명령어 확인 부탁 드립니다. 7 Philip Park 2020.12.29 51
3333 Cannot cummunicate with broker.. 1 file 진석 2020.12.29 29
3332 샤드 관련 문의 드립니다. 1 레오나르도 2020.12.28 23
3331 WinNGS 통해서 CM 관리모드 사용할때 8001포트 사용하고 있습니다. 1 Philip Park 2020.12.24 32
3330 시스템 뷰 조회 성능 문의 4 bchlim 2020.12.22 80
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 168 Next
/ 168

Contact Cubrid

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