2014-05-19 1 views
0

MySQL을 처음 접하게되었습니다.느린 쿼리는 전체 HDD 공간을 차지하므로 "1030 Got error 28 from storage engine"

느린 쿼리는 1030 오류 코드로 끝나는 전체 HDD 공간을 차지합니다.

INSERT INTO schema.Table C 
SELECT a.`Date`, a.Store, a.SKU, 
     floor((a.QTY/((b.CASEQTY * b.CASEPERLAYER) * b.LAYERPERPALLET))) AS Pallets, 
     floor(((a.QTY/((b.CASEPERLAYER * b.LAYERPERPALLET) * b.CASEQTY)) /.CASEQTY)) AS Cases, 
     (a.QTY * b.CASEQTY) AS Pieces 
FROM 
    (schema.table1 AS a 
    INNER JOIN schema.table2 AS b) 
    WHERE a.Description = 'BLAH'; 

문제 :

나는 위의 쿼리를 실행하면 내가 100 행의 한계와 0.01 초에서 필요로하는 결과를 얻을 수 있습니다. 그러나 준비된 테이블에 쿼리를 삽입하려고하면 실패합니다.

위의 쿼리는 기본적으로 HDD가 가득 찰 때까지 몇 시간 동안 실행됩니다. 표 A는 수천만 개의 레코드와 표 B를 포함합니다. 스토리지 엔진은 InnoDB입니다. 3 시간 동안 유사한 쿼리를 실행하고 성공했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

0

내부 조인 문에 조인 기준이 없습니다. 이것은 "카티 션 곱 (cartesian product)"이라고 불리는 무언가 (나쁜 것)가 될 것입니다. 따라서 테이블 A에 백만 레코드가 있고 테이블 b에 천이 들어 있으면 테이블 A의 각 행이 다른 테이블의 모든 행과 일치합니다. 적어도 10 억 개의 레코드를 제공해야합니다.

이 문제를 해결하려면 조인에 "ON"절을 사용하여 두 테이블 간의 관계를 정의하거나 제한해야합니다. 그렇지 않으면 WHERE 절에 들어갈 수 있습니다.

+0

ON 절을 완전히 잊어 버렸습니다! 그 점을 지적 해 주셔서 감사합니다! 나는 이것이 InnoDB 엔진과 관련이 있다고 생각하는 이유를 알아 내려고 3 일을 보냈습니다. – user3652818

2

그건 MySQL에서 특별한 것입니다. INNER JOIN에도 불구하고 CROSS JOIN과 같이 ON 절을 생략하면됩니다. (다른 DBMS는 구문 오류가 발생합니다.)

을 따라서 표 1과 표 2에서 기록과 일치하는 ON 절을 지정하지 않음으로써 당신은 표 2의 모든 레코드 표에 모든 기록을 일치합니다. 이것들은 많을 수 있습니다 :-)