2016-09-20 2 views
-1

조건을 만족할 때 테이블을 업데이트하는 병합 쿼리가 있습니다.이 쿼리는 만족스럽지 않으면 다른 테이블에 레코드를 삽입합니다. 문제는이 특정 삽입은 15,000 개의 레코드를 삽입하는 데 약 25 분이 소요되는 것입니다. 레코드를 삽입하는 동안 시퀀스 ID를 삽입하고 차례로 트리거 ID와 연결된 트리거에 의해 생성됩니다. 트리거는 2 개의 테이블에서 최대 ID를 선택하므로 최대 값에 1을 더한 다음이를 리턴하여 삽입 쿼리에서 사용합니다. 인서트가 내 저장 프로 시저에서 속도가 느린 이유는 정확합니까? 이 SP는 DB2에서 실행됩니다.DB2에 많은 시간을들이는 삽입물

+0

프로세스가 행 단위 처리를 사용하고있는 것 같습니다. 세트 기반 솔루션을 찾을 수 있는지 확인하십시오. – HLGEM

+2

쿼리 계획을 보면 정확히 병목 현상을 알 수 있습니다. 당신이하는 것처럼 시퀀스 번호를 생성하는 것은 일반적으로 성능이 좋지 않을뿐 아니라 가능한 경쟁 조건으로 인해 매우 나쁜 아이디어입니다. – mustaccio

+0

DB가 테이블에 두 개의 인덱스를 유지하는 경우 bluk 삽입은 두 배의 시간이 소요됩니다. 50 개의 색인은 50 배의 시간이 소요됩니다. 일부 OS에서는 인덱스가 실제로 필요하기 전까지 고유하지 않은 인덱스를 끌 수 있습니다. 또는 ID를 얻은 테이블에 ID의 고유 인덱스가 필요합니다. 30kids를 예약하고 낭비 할 수있는 것보다 빠르게 작업을 수행 할 것입니다. – danny117

답변

0

트리거는 성능을 위해 좋은 해결책이 아닙니다. 테이블에 자동 증가 열을 사용하십시오.

0

병목 현상은 실제로 트리거입니다. 나는 방아쇠를 떨어 뜨리고 sp를 달렸다, 약 15k 기록을 삽입하는 데 최대 2 분이 걸렸다. 지금 트리거 대신 시퀀스를 사용하고 있습니다.