2014-12-30 3 views
0

테이블에 인덱스가 4 개 있습니다. 이 같은 업데이트 쿼리를 실행하는 경우인덱스가있는 테이블에서 쿼리가 느리게 업데이트됩니다.

UPDATE table SET column_without_indexes = true; 

700k 행의 경우 10 분을 초과하여 매우 느리게 실행됩니다. 그러나 쿼리를 실행하기 전에 테이블에 모든 인덱스를 삭제하면 30 초 후에 실행됩니다.

업데이트가되지 않는 열에 인덱스를 추가하면 UPDATE 쿼리가 느려지는 이유는 무엇입니까?

+0

이 테이블의 모든 레코드를 업데이트합니다. 아무도 하나 이상의 레코드를 잠그지 않았습니까? 그리고 업데이트가 실제로 DELETE + INSERT임을 잊지 마십시오.이 때문에 모든 인덱스에 새 인덱스 튜플을 만들어야합니다. –

+0

"업데이트는 실제로 DELETE + INSERT입니다." 정말요? 나는 그것에 대해 의심이있다. – flgdev

+1

@flgdev 그래 ... 동시성 제어 및 MVCC, HOT 업데이트 등에 대한 설명서를 읽으십시오. 최근에 이것에 대한 좀 더 자세한 설명을했습니다. http://dba.stackexchange.com/q/84802/7788을 참조하십시오. –

답변

0

예, UPDATE는 DELETE + INSERT입니다.

예를 들어 원하는 경우 테이블 간단한 조회 테이블 (몇 개의 레코드 포함)을 가져 와서 테이블의 첫 번째 레코드를 가져 와서 업데이트하십시오. 다음과 같이 말하십시오 :

update table set [col1] = [col1] 
where table_id = ? 

이것은 데모 목적으로 단일 레코드를 업데이트하기 위해 수행되어야합니다.

그런 다음 테이블에서 select를 실행하면 테이블 상단에 있던이 레코드가 현재 하단에 있음을 알 수 있습니다.

SQL 처리 및 업데이트에 대한 표준입니다.

문자 그대로 OLD 레코드를 삭제하고 NEW 레코드를 삽입합니다. OLD 레코드로 어지럽히는 데 신경 쓰지 않습니다.

이 700k 행에 대한 업데이트를 수행 할 때 700k 행에 대해 DELETE + INSERT를 수행하고이를 모두 새로 인덱싱하여 한 번에 모두 수행한다는 것을 알고 있습니다. 메모리는 TRANSACT SQL을 다루기 때문에 기본적으로 메모리에있는 모든 것을 저장합니다.

어쩌면 당신은 다른 방법으로 업데이트를 수행하거나 한 번에 10k 개의 행을 피드 할 수 있습니다.

관련 문제