2014-10-15 6 views
0

내가 열이있는 테이블 Temp_load 있습니다. 오류가

내가 쿼리

INSERT INTO <Schema_name>.`Temp_load` 
      (key, 
      plane_key, 
      locat_key, 
      time_period_key, 
      business_unit_key, 
      curret_allocated, 
      value) 
(SELECT DISTINCT 1, 
       plane_key, 
       locat_key, 
       1, 
       CASE 
        WHEN current_area = 'HEALTH' THEN 1 
        WHEN current_area = 'BEAUTY/PERSONAL' THEN 3 
        WHEN current_area = 'GM' THEN 2 
        WHEN current_area = 'CONSUMABLES' THEN 4 
       end, 
       current_flag, 
       opt_metric_1 
FROM staging.curves 
WHERE opt_metric_1 IS NOT NULL 
     AND current_area IS NOT NULL); 

소스 테이블이 거기에 2900 만 개 기록을 가지고있다 이하로 사용하여이 테이블에 데이터를 삽입하려합니다. 위의 삽입 통계는 5 시간 이상 실행 중이며 계속 실행 중입니다. 나는 같은 테이블에서 2900 만개의 삽입을하고 있는데 다른 테이블에 3 배 더 삽입해야한다.

LOAD DATA INFILE을 사용하여로드하려고하면 ERROR 1205 (HY000)가 발생합니다. 잠금 대기 시간 초과를 초과했습니다. 트랜잭션을 다시 시작해보십시오. innodb_lock_wait_timeout을 120으로 늘려 보았지만 여전히 문제가 있습니다.

로드하기 전에 플래그 아래에서 사용할 수 없습니다.

SET FOREIGN_KEY_CHECKS = 0; 
SET UNIQUE_CHECKS = 0; 
SET AUTOCOMMIT = 0; 

다른 최적의 해결책이 있습니까? 삽입이 훨씬 더 빠른 방법으로 수행 될 수 있습니다.

감사

+0

입력 데이터의 무결성을 가정 할 수 있다면, 당신은 사전에 목표 테이블에서 인덱스를 제거하려고 만 추가 할 수 삽입 후에 다시. 인덱스 데이터를 자주 다시 작성해야하기 때문에 인덱스를 사용하면 대용량 데이터 삽입이 느려질 수 있습니다. 이후에 인덱스를 추가하는 것만으로도 작업 속도를 높일 수 있습니다. (보장은 없습니다.) – CBroe

답변

0

문제는 각 행 삽입에 대한 기본 키 무결성이 선택되어 있는지 수 있습니다. 데이터를 삽입하기 전에 PK를 제거해야합니다. MariaDB에서 이러한 검사 중 일부를 비활성화 할 수 있지만 MySQL에서도 가능한지는 알 수 없습니다.

대안은 다른 테이블에 UNION 당신의 Temp_loadstaging.curves에 수 있습니다 :

CREATE TABLE myNewTable 
SELECT ... FROM Temp_load 
UNION 
SELECT ... FROM staging.curves