2009-02-06 3 views
0

테이블 2 업데이트 테이블 업데이트 업데이트날짜가입니다. 우리는 다른 테이블 날짜에서보고 TableToUpdate의 EndTimeKey 열을 업데이트해야합니다. 우리는 이렇게하기 위해 아래의 SQL을 실행하지만, 완료하는 데 오래 걸립니다.SQL 업데이트 최적화

TableToUpdate는 6M 기록을 가지고있다. 표 날짜에는 5000 개의 레코드가 있습니다.

어떻게 최적화 할 수 있습니까?

답장을 보내 주셔서 감사합니다.

update TableToUpdate set 
EndTimeKey = DATE_NO 
from Dates where EndTime = DATE 
+0

사용중인 RDBMS를 지정하십시오. – Quassnoi

+0

SQL Server 2005를 사용하고 있습니다. – Canavar

답변

2

잠재적으로 6 백만 개의 레코드를 업데이트 중입니다. 어떤 경우에도 대단히 빠른 속도는 아닙니다. 그러나 실행 계획을보고 인덱스를 사용하는지 확인하십시오.

대량으로 레코드를 업데이트 할 때 일반적으로 더 빠른이 작업을 일괄 적으로 실행하십시오. 데이터베이스에 부하가 거의없는 근무 외 시간 동안 업데이트를 수행하면 잠재적 인 잠금 문제가 줄어 듭니다. 암시 적 변환을 수행 할 필요가 없도록 두 테이블간에 데이터 유형이 동일해야합니다.

업데이트 할 테이블을 확인하십시오. 트리거가 있습니까? 트리거가 작성된 방법에 따라 많은 레코드의 업데이트가 심각하게 느려질 수 있습니다 (특히 너무 밝지 않은 사람이 세트 기반 코드를 작성하는 대신 커서 나 루프를 트리거에 넣기로 결정한 경우).

가 또한 여기에 내가 추가 할 몇 가지 일이 이미 일치하는 기록을 갱신에서

update t 
set EndTimeKey = DATE_NO 
from TableToUpdate t 
Join Dates D on t.EndTime = d.DATE 
where EndTimeKey <> DATE_NO 

없음 포인트 (I는 또한 명시 적으로 보여 조인을 보여 변경).

0

관련 필드 (예 : endtimekey 및 endtime)에 대한 색인을 관련 필드에 설정할 수 있습니다. 이것의 대부분을 기대하지 마라. 쿼리 결과를 제한하는 다른 제약 조건이있는 경우 확인할 수 있습니다.

또한 모든 올바른 date_no을 tabletoupdate.endtimekey에 대한 반환하는 뷰를 만들 수 있습니다. 당신의 DBMS는 물건을 지원하는 경우

아마 당신은 저장 - 프로 시저를 쓸 수 있습니다 -이 정말 업데이트를 촉진하기 때문.

0

여기 몇 가지 사실을 알기 원하면 EndTimeKey가 실제로 핵심입니까? 그렇다면 색인이있을 수 있습니다. 속도 (또는 색인이없는 경우)를 사용하면 색인을 업데이트하면서 데이터의 실제 업데이트도 수행 할 수 있습니다. 솔루션은 색인을 삭제하고 색인을 다시 적용하여 업데이트를 실행합니다.

또 다른 문제는 SQL의 트랜잭션 성격이 될 수 -이 업데이트를 할로 다시 실패의 경우에 롤백 할 수 있도록 모든 변경 사항을 기록합니다. 이 업데이트는 매우 간단 것 같아요, 그래서 일괄 관리 가능한 크기의 덩어리로 업데이트가 중단됩니다

update TableToUpdate setEndTimeKey = DATE_NOfrom Dates where EndTime = DATE 
where TableToUpdateId between 1 and 100000 

을 IE에서 당신은 그것을 적용 할 수 - 최소한 각 청크가 얼마나 걸릴지 아이디어를 얻을 수 있습니다.

또 다른 옵션

은 잠재적으로 전체 테이블 스캔을 수행하는 보내고는 ENDTIME 컬럼에 인덱스를두고있다.

진짜 대답은 생성되는 쿼리 계획을 보는 것입니다. 알 수 있듯이 쿼리가 느려질 수있는 데에는 여러 가지 이유가 있습니다.

1

이 데이터 양을 사용하면 새 테이블을보고 싶은 것처럼 결과 집합을 생성하고 업데이트 된 값으로 완료하는 SELECT 쿼리를 만드는 것이 가장 좋습니다. 그런 다음, 테이블을 작성하고 INSERT INTO를 사용하거나 SELECT를 변경하여 INTO를 추가하여 새 테이블을 작성하여 이들을 새 테이블 ('NewTableToUpdate')에 선택하십시오.

다음으로 sp_rename을 사용하여 'TableToUpdate'를 'OLDTableToUpdate'로, 'NEWTableToUpdate'를 'TableToUpdate'로 바꾸고 원본 테이블 에서처럼 인덱스를 만듭니다.

내 경험상이 점이 큰 변화를 가져 오는 가장 빠른 방법이라는 것을 알았습니다. HTH.

추가 고려 사항 ... 테이블에 클러스터 된 인덱스가있는 경우 SELECT 문에 ORDER BY를 추가하여 클러스터 된 인덱스와 동일한 순서로 새 테이블에 삽입되는지 확인하십시오. 그러면 인덱스 생성 속도가 상당히 빨라질 것입니다.