Background Image

FORUM

조회 수 296 추천 수 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 4246
3836 백업 및 복구 시 cubrid 버전 간 호환 문의 1 플레이어블 2023.04.13 71
3835 centos8에서 쉘스크립트 실행시 csql: command not found 오류 발생 6 kjn4345 2023.04.13 165
3834 큐브리드 timestamp 오류 문의 5 jjun7204 2023.04.12 147
3833 Cubrid DB 서버 swap memory 사용률 관련 질의 1 오라클민 2023.04.12 206
3832 Mac OS 큐브리드 매니저 실행이 안 됩니다. 2 아데산야라이트훅 2023.04.07 127
3831 blob select 1 네오랜덤 2023.04.05 125
3830 dba권한 상속 1 네오랜덤 2023.04.05 81
3829 mac os m1 실행시 무응답 실행안됩니다. 6 시나몬빵 2023.04.04 140
3828 함수/프로시져 구동시 필요한 java버젼 1 네오랜덤 2023.03.31 110
3827 큐브리드 설치 도중 취소한 후, 재설치가 불가능합니다. 5 복괴 2023.03.28 151
3826 where in () 서브쿼리 관련 문의입니다 1 제리리 2023.03.27 105
3825 한글을 입력받아 한글을 리턴하는 CUBRID JAVA StoredProcedure 작성시 window 환경에서 리턴 값이 깨져서 출력 됨 2 두목원슝 2023.03.22 158
3824 큐브리드 DAMO(암호화)관련 버전 호환관련하여 문의드립니다. 3 초코초코초 2023.03.20 228
3823 cubrid manager 에러?? 3 11시38분 2023.03.20 208
3822 PreparedStatement.executeBatch에서 일부 데이터의 오류 시 반환 값 문의 2 새옹지마 2023.03.18 320
3821 db생성경로가 db테이블과 결과조회에 영향을 미치나요? 1 dfdfdd 2023.03.15 113
3820 SQL statement violated NOT NULL constraint 1 yoo 2023.03.15 159
3819 콤마로 split하는 기능 구현 관련 문의 5 플레이어블 2023.03.15 274
3818 insert문에서 replace 1 yoo 2023.03.15 114
3817 cubrid 파라미터 바인딩 3 DJ 2023.03.14 160
Board Pagination Prev 1 ... 3 4 5 6 7 8 9 10 11 12 ... 199 Next
/ 199

Contact Cubrid

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