hextoraw로 업데이트, delete 문장 실행 느린 해결

1828 단어
문제 설명
최근에 데이터 동기화 기능을 하고 있다. 각 모듈의 데이터는 AOP의 차단을 거쳐 insert, update, delete 문구를 형성하고 Kafka에 통일적으로 들어간 다음에 소비단에서 Oracle로 소비한다.그러나 소비 과정에서 insert는 한 개의 평균 4ms를 소모하지만 한 개의 데이터를 갱신하는 데 평균 12s를 소모한다. 특히 3, 4천만 개의 시계를 갱신할 때 30여 초에 달하고 삭제도 느리다.소비가 쌓이다.
ql문장은 다음과 같습니다
     INSERT INTO TEST(ID,NAME,AGE,TIME) VALUES ('4089480E7212C8B4017292D62A49000D','  ','32',sysdate);

     UPDATE TEST SET NAME='  ',AGE='45' WHERE ID = '4089480E7212C8B4017292D62A49000D';

     DELETE FROM TEST WHERE ID = '4089480E7212C8B4017292D62A49000D';

 
문제 분석
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 where id = ‘4089480E7212C8B4017292D62A49000D’

   우리 표의 메인 키 ID는 RAW(16) 형식을 사용하기 때문에 데이터베이스에 저장된 것은 모두 2진법이고 인덱스도 자연히 2진법 데이터에 기초를 둔다.직접 id ='4089480E7212C8B4017292D62A49000D'는 이 문자열을 사용하여 데이터베이스에서 모든 id 문자열과 비교하여 인덱스를 사용할 수 없어 업데이트와 delete가 느린 것과 같다.
 
해결 방법
    는 Oracle에서 자체로 가지고 있는 hextoraw 함수를 사용합니다. 예를 들어
UPDATE TEST SET NAME='  ',AGE='45' WHERE ID = hextoraw('4089480E7212C8B4017292D62A49000D');

  hextoraw 함수는 16진법을 2진법으로 바꿉니다. 데이터 재고가 2진법이고 인덱스도 2진법으로 만들어졌기 때문에where 조건은 id에 따라 인덱스를 찾을 수 있고 업데이트와 delete가 느린 문제도 해결됩니다.
    테스트를 거쳤습니다.
select * from test where id = '4089480E7212C8B4017292D62A49000D'
  20s


select * from test where id = hextoraw('4089480E7212C8B4017292D62A49000D')
  0.12s

 
총결산
   그러므로 sql문장의 실행을 분석할 때 색인이 있는지, 색인이 갔는지 여부를 우선적으로 고려합니다.   id 사용 또는 하면 이 문제가 존재하지 않습니다. 직접 비교하면 됩니다.   프로젝트가 오랫동안 운영되었기 때문에 처음에 디자인한 UUID를 메인 키로 사용했는데 유사한 sql가 매우 많다. 데이터의 양이 누적되면서 조회 효율에 큰 영향을 미쳤기 때문에 다음에 잘 수정해야 한다.

좋은 웹페이지 즐겨찾기