Background Image

FORUM

조회 수 299 추천 수 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
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 admin 2024.04.23 50
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4458
3854 원하는 테이블에 데이터를 추가 하고싶으면 어떻게 하나요? 1 나동호 2009.03.25 10981
3853 온라인 메뉴얼이 firefox에서 동작이 안되네요. 1 flypig 2009.03.25 11128
3852 세로로 나온 레코드를 하나의 컬럼 담고 싶습니다. (긴급)(폭스소프트) 2 돌돌이 2009.03.26 14501
3851 Database 선택시 "Database(demodb) is running is standalone mode" 오류 5 둘리 2009.03.26 15418
3850 Fedra 10 에서 8.1.4 설치 문의 2 스나이퍼 2009.03.26 17804
3849 페도라 10에서 큐브리드 rpm 설치시 오류 1 스나이퍼 2009.03.26 16391
3848 설치 대상 경로에 공백있으면 설치가 안됩니다. 1 푸른여행 2009.03.30 16674
3847 데이터 구조 질문 1 rahmat 2009.03.31 10571
3846 64 bit 포팅이란? 6 초보대왕 2009.03.31 22003
3845 ODBC 핸들로 조회시 조회 갯수 재한? 4 ApiClasser 2009.04.01 11461
3844 데이터베이스로드와 언로드를 이용한 데이터 입력시 1 rahmat 2009.04.02 13640
3843 demodb에 Table이 없어요. 1 flypig 2009.04.02 11845
3842 java 1.4에서는 큐브리드 동작안하나요? 1 나상숙 2009.04.03 13170
3841 cubrid.jdbc.driver.CUBRIDException: 4 아르미 2009.04.03 25729
3840 database 시동이 안되요 1 2 나상숙 2009.04.04 10498
3839 cubrid 없이 php ext 설치를 원합니다. 2 송효진 2009.04.04 11931
3838 windows2000 에서 database 가동이 안되요 2 file 홍길동 2009.04.04 13416
3837 cubrid ebuild && 문제점 보고. 1 송효진 2009.04.05 13706
3836 php cubrid_bind() 에 관하여. 1 송효진 2009.04.05 11440
3835 큐브리드 온라인 도움말 수정요청. 5 송효진 2009.04.05 16129
Board Pagination Prev 1 ... 3 4 5 6 7 8 9 10 11 12 ... 200 Next
/ 200

Contact Cubrid

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